python - 使用 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 上都安装到正确的路径中。
- 视窗:
<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.'
)
概括
是否可以在没有后缀的情况下安装与操作系统无关的脚本,并且不必在操作系统的上下文中重命名它们?
解决方案
推荐阅读
- c# - 如何从我的项目访问我的 MongoDB 实例到我的 xunit 测试项目类?
- android - 我怎样才能将我的图像放在一个圆圈中而不出现在 Android Studio 上?
- python - 创建“压缩”字典
- php - 使用命名空间(PHP)从另一个类调用方法
- java - 在其他语言中状态为 200 时,在 Java 中登录后重定向 302
- php - 可以在类中获取数据但返回时只发送布尔值php PDO?
- c# - HtmlAgilityPack NullReferenceException 错误
- python - PySpark:连接数据类型为“Struc”的两列-> 错误:由于数据类型不匹配而无法解决
- java - 使按钮适应 JavaFX 中的窗口大小调整(重新定位)
- blob - 在复制活动期间或在 blob 数据集中指定名称时将日期时间动态附加到文件名