OSindependent使用setuptools安装脚本

2024-10-01 15:41:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正试图解决一个与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'
__requires__ = 'homeinfotools==0.0.0'
__import__('pkg_resources').run_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',
    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 SCRIPTS],
    license='GPLv3',
    description='HOMEINFO Digital Signage Linux configurator.'
)

摘要

是否可以在不使用后缀的情况下独立于操作系统安装脚本,并且不必在操作系统的上下文中重命名脚本


Tags: pathnamefrompyimport脚本linuxwindows

热门问题