2

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

python setup.py install --home=~

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

然而,它所做的一件事是替换我在脚本文件中的 shebang。所以,不是 nice friendly #!/usr/bin/env python,而是将其替换为#!/usr/bin/python

现在,由于我的包只为当前用户安装,它无法看到包中的模块进行导入。

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

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

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

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

4

1 回答 1

0

编辑:我忘了提到 --executable 选项。我不知道这是否存在于 2.3 中,但它在 2.7 中可以使用当前解释器覆盖对 hashbangs 的重写。先试试这个。

如果 --executable 开关不起作用,您应该能够按照自己的方式编写自己的 setup.py。setup.py 的关键在于它必须调用 distutils.core.setup()。如果 distutils 在setup()被调用时做了一些愚蠢的事情,那么在你的 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)

其中“脚本列表”是包含要更新的脚本路径的字符串列表。这是一个有点不稳定的解决方案。我知道 --executable 的东西在 2.7 中有效,而且在 2.3 中肯定有类似的东西,即使同一个开关不存在完全一样的东西。

于 2013-06-14T00:27:00.160 回答