14

我正在使用众所周知的第三方打包系统打包一些 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 命令。(虽然这是我的后备。)

有没有什么方法可以在 shebang 之后使用setuptools标志或配置更改解释器路径?

4

3 回答 3

23

您可以通过设置 'sys.executable' 自定义 console_scripts 的 shebang 行(从debian 错误报告中了解到这一点)。也就是说...

sys.executable = '/bin/custom_python'

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

更好的是在构建时包含“执行”参数......

setup(
  entry_points={
    'console_scripts': [
       ... etc...
    ]
  },
  options={
      'build_scripts': {
          'executable': '/bin/custom_python',
      },
  }
)
于 2013-06-26T20:07:42.953 回答
2

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

$ ./venv/bin/pip install --global-option=build \
--global-option='--executable=/bin/custom_python' .
...
$ head -1 ./venv/bin/some-entry-point
#!/bin/custom_python
于 2016-06-23T09:19:41.223 回答
1

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

#!/bin/custom_python

(我尝试了@damian 的回答,但对我不起作用,也许 Debian Jessie 上的 setuptools 版本太旧了)

于 2016-12-27T18:47:12.210 回答