使用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 (将#修改为@)