更改console_script入口点解释器以进行打包

时间:2013-06-21 14:34:42

标签: python setuptools distutils

我使用众所周知的第三方打包系统打包一些python包,我遇到了创建入口点的问题。

当我在我的机器上安装一个入口点时,入口点将包含一个指向任何python解释器的shebang,如下所示:

/home/me/development/test/setup.py

中的

from setuptools import setup
setup(
    entry_points={
        "console_scripts": [
            'some-entry-point = test:main',
        ]
    }
)        

/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')()
)

正如您所看到的,入口点样板文件包含一个硬编码的python解释器路径,该路径位于我用来创建第三方软件包的虚拟环境中。

使用我的第三方打包系统安装此入口点会导致计算机上安装入口点。但是,通过对目标计算机上不存在的python解释器的这种硬编码引用,用户必须运行python /path/to/some-entry-point

shebang使这个非常不可移植。 (这肯定不是virtualenv的设计目标;但我只需要在这里使它更便携。)

我宁愿不诉诸疯狂的find / xargs / sed命令。 (虽然这是我的后备。)

在使用setuptools标志或配置进行shebang后,我是否可以通过某种方式更改解释器路径?

3 个答案:

答案 0 :(得分:16)

您可以通过设置'sys.executable'来自定义console_scripts的shebang行(从debian bug report中学习)。那就是说......

sys.executable = '/bin/custom_python'

setup(
  entry_points={
    'console_scripts': [
       ... etc...
    ]
  }
)

更好的方法是在构建时包含'execute'参数...

setup(
  entry_points={
    'console_scripts': [
       ... etc...
    ]
  },
  options={
      'build_scripts': {
          'executable': '/bin/custom_python',
      },
  }
)

答案 1 :(得分:2)

只需更改 setup.py 的shebang即可匹配您希望入口点使用的python:

#!/bin/custom_python

(我试过@damian的答案,但没有为我工作,也许Debian Jessie的setuptools版本太旧了)

答案 2 :(得分:1)

对于想要在运行时执行此操作而不修改setup.py的人的未来参考,可以通过setup.py build将解释器路径传递给pip

$ ./venv/bin/pip install --global-option=build \
--global-option='--executable=/bin/custom_python' .
...
$ head -1 ./venv/bin/some-entry-point
#!/bin/custom_python