我使用众所周知的第三方包装系统打包一些python包,我遇到了创建入口点的问题.
当我在我的机器上安装一个入口点时,入口点将包含指向任何python解释器的shebang,如下所示:
在/home/me/development/test/setup.py中
from setuptools import setup
setup(
entry_points={
"console_scripts": [
'some-entry-point = test:main',
]
}
)
Run Code Online (Sandbox Code Playgroud)
在/home/me/.virtualenvs/test/bin/some-entry-point中:
#!/home/me/.virtualenvs/test/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'test==1.0.0','console_scripts','some-entry-point'
__requires__ = 'test==1.0.0'
import sys
from pkg_resources import load_entry_point
sys.exit(
load_entry_point('test==1.0.0', 'console_scripts', 'some-entry-point')()
)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,入口点样板文件包含一个硬编码的python解释器路径,该路径位于我用于创建第三方软件包的虚拟环境中.
使用我的第三方打包系统安装此入口点会导致在计算机上安装入口点.但是,通过对目标机器上不存在的python解释器的这种硬编码引用,用户必须运行python /path/to/some-entry-point.
shebang使这个非常不可移植.(这肯定不是virtualenv的设计目标;但我只需要在这里使它更便携.)
我宁愿不诉诸疯狂的find/xargs/sed命令.(虽然这是我的后备.)
有没有什么方法可以在shebang使用setuptools旗帜或配置后改变解释器路径?
我为使用模块(https://luarocks.org/)管理软件包的系统编写了小型python 软件包。对于那些不了解它的人,可以运行module load x并运行一个小的脚本来修改各种环境变量以使软件“ x”正常工作,然后可以使用撤消该操作module unload x。
这种软件管理方法在科学计算中几乎无处不在,并且在该领域具有很大的价值:您可以将古老的未维护软件与该软件可能会干扰的软件包一起运行,可以运行多个版本的软件,从而使自己的产品再现。准确地记录数据(您可以返回到旧版本),并且可以运行具有过时依赖关系的坦率地编写未更新的软件。
这些功能很棒,但是它们在python 2/3 split中造成了问题:
如果您想编写一个同时适用于python 2和3 的软件包并将其与需要 python 2或3的软件一起使用怎么办?
使旧的python2依赖软件在这些大型系统上工作的方式是,您制作了python / 2.7.x模块和python / 3.5模块。当您要运行使用python 2的脚本时,请加载该模块等。
但是,我想编写一个可以在两种环境下都可以使用的python软件包,因为无论使用哪种python解释器,我都希望该软件处于活动状态。
从根本上讲,这非常容易:只需使用#!/usr/bin/env pythonshebang线就可以了。这样可行。我编写了所有软件都可以使用,所以没有问题。
问题是:我想使用setuptools将我的软件包分发给处于相同情况的其他科学家,而setup工具会破坏shebang线。
我不想就修改shebang线是否是一个好主意展开辩论,我相信这是因为它已经在同一状态下存在多年了。老实说,我不在乎,这对我不起作用。默认的setuptools安装会导致软件无法运行,因为当未加载python解释器的模块时,该python解释器将无法运行,这PYTHONPATH是完全错误的。
如果我所有的用户都具有root用户访问权限,则可以使用该data_files选项将脚本复制到/usr/bin,但这对兼容性不是一个好主意,而且我的用户也没有root用户访问权限,因此这是一个有争议的问题。
到目前为止,我尝试过的事情:
我尝试设置sys.executable到/usr/bin/env python中setup.py文件,但不起作用,因为那时家当是:#!"/usr/bin/env python",这显然是行不通的。
我在以下问题中尝试了“不要触碰我的shebang类”想法:不要触碰我的shebang!(这是最低的答案,票数为0)。那也不起作用,可能是因为它是为distutils而不是setuptools编写的。再加上这个问题已有6年历史了。
我还看了这些问题:
Setuptools entry_points / console_scripts在shebang中具有特定的Python版本
那里描述的方法不起作用,shebang线仍被更改。
创建一个setup.cfg包含以下内容的文件:
[build]
executable = /usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
也不会改变shebang行的行为。 …