首页 > 解决方案 > 使用 setuptools 独立于操作系统安装脚本

问题描述

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

#! /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 下的脚本。它会产生“找不到命令”错误(德语语言环境):

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.'
)

概括

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

标签: pythonpython-3.xlinuxwindowssetuptools

解决方案


推荐阅读