微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用setuptools安装脚本的与操作系统无关的脚本

如何解决使用setuptools安装脚本的与操作系统无关的脚本

我目前正在尝试解决有关在setuptools分发的python项目中安装脚本的问题。 脚本之一是

#! /usr/bin/env python3
"""Terminal querying utility."""

from homeinfotools.query.main import main


if __name__ == '__main__':
    main()

位于<projectdir>/scripts/sysquery。 设置脚本位于<projectdir>/setup.py上,包含以下内容

#! /usr/bin/env python3
"""Installation script."""

from pathlib import Path
from setuptools import setup


setup(
    name='homeinfotools',version_format='{tag}',author='HOMEINFO - Digitale informationssysteme GmbH',author_email='REDACTED',maintainer='Richard Neumann',maintainer_email='REDACTED',python_requires='>=3.8',install_requires=['setuptools-git-version','requests'],packages=[
        'homeinfotools','homeinfotools.query','homeinfotools.rpc','homeinfotools.vpn'
    ],scripts=[str(path) for path in Path('scripts').iterdir()],license='GPLv3',description='HOMEINFO Digital Signage Linux configurator.'
)

现在我面临的问题是,安装通过

python setup.py install --optimize=1

在Windows和Linux系统上具有不同的行为。 这些脚本会在Windows和Linux上安装到正确的路径中。

  • Windows:<pythondir>\Scripts\sysquery
  • Linux:<prefix>/bin/sysquery

不幸的是,我无法以这种方式在Windows下调用脚本。会产生“找不到命令”错误(德语语言环境):

C:\Users\HOMEINFO GmbH>sysquery
Der Befehl "sysquery" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

C:\Users\HOMEINFO GmbH>

在Windows上安装后的脚本内容为:

#!"C:\Program Files\python39\python.exe"
# EASY-INSTALL-SCRIPT: 'homeinfotools==0.0.0','sysquery'
__requires__ = 'homeinfotools==0.0.0'
__import__('pkg_resources').run_script('homeinfotools==0.0.0','sysquery')

PATH没问题,因为我可以在同一目录中运行其他脚本。 我将错误归结为一个事实,即Windows似乎需要在脚本上使用.py后缀才能调用它们。 如果我相应地更改了脚本名称,则会在Scripts目录中获得两个脚本:

sysqery

#!"C:\Program Files\python39\python.exe"
# EASY-INSTALL-SCRIPT: 'homeinfotools==0.0.0','sysquery')

sysquery.py

#!"C:\Program Files\python39\python.exe"
# EASY-INSTALL-SCRIPT: 'homeinfotools==1.0.5','sysquery.py'
__requires__ = 'homeinfotools==1.0.5'
__import__('pkg_resources').run_script('homeinfotools==1.0.5','sysquery.py')

在这种情况下,我可以从命令行正常运行命令sysquery

但是,这留下了问题,那就是在Linux系统上,脚本也将带有.py后缀,这是不希望的。

因此,我在setup.py中提出了一个特定于操作系统的解决方案,该解决方案虽然有效,但很丑陋:

#! /usr/bin/env python3
"""Installation script."""

from os import name
from pathlib import Path
from setuptools import setup


SCRIPTS = Path('scripts').iterdir()

if name == 'nt':
    SCRIPTS = [path.rename(f'{path}.py') for path in SCRIPTS]


setup(
    name='homeinfotools',scripts=[str(path) for path in SCRIPTS],description='HOMEINFO Digital Signage Linux configurator.'
)

摘要

是否可以在不带后缀的情况下安装与操作系统无关的脚本,而不必在os的上下文中重命名它们?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。