Python 2.3 distutils使用/ usr / bin / python而不是/ usr / bin / env python覆盖shebang

时间:2013-06-14 00:07:34

标签: python distutils

我有一个我在共享开发系统上安装的软件包。我希望软件包带来的脚本仅供我的用户(或其他任何要求它的用户)使用。要安装软件包,我在软件包目录中使用以下命令:

python setup.py install --home =〜

到目前为止,我做了我希望它做的所有事情。它安装我的模块并将脚本放在/ home / $(whoami)/ bin目录中。

然而,有一件事是替换脚本文件中的shebang。因此,它取代了友好的#!/usr/bin/env python,而不是#!/usr/bin/python

现在,由于我的软件包仅为当前用户安装,因此无法在软件包中看到要导入的模块。

因此,由于我的脚本从包中的模块导入函数,因此从命令行运行它们会导致导入错误。

运行交互式python解释器允许我使用与我想要运行的脚本中的导入行完全相同的文本来导入文件。

有谁知道我可以解决这个问题的方法吗?

P.S。不,我无法控制此设置中的Python版本。在可预见的未来,这是2.3.4。

1 个答案:

答案 0 :(得分:0)

编辑:我忘了提到--executable选项。我不知道它是否存在于2.3中,但它在2.7中工作以覆盖当前解释器所用的重写hashbang。先尝试一下。

如果--executable开关不起作用,您应该能够按照自己的方式编写自己的setup.py.关于setup.py的关键是它必须调用distutils.core.setup()。如果在调用setup()时distutils正在做一些愚蠢的事情,那么在之后的setup.py例程中添加一个更正:

from distutils.core import setup
import os
setup(name='foo', version='1.0', py_modules=['spam', 'eggs'])
fix_hashbang(script_list):
    sed = "sed -i 's/#! \/usr\/bin\/python/#! \/usr\/bin\/env python/'"
    cmd = ' '.join([sed, ' '.join(script_list)])
    os.system(cmd)
fix_hashbang(list_of_scripts)

其中“脚本列表”是包含要更新的脚本路径的字符串列表。这是一个不太好的解决方案。我知道 - 可执行的东西在2.7中工作,并且肯定在2.3中必须有类似的东西,即使相同的开关不完全存在。