Python2.3 distutils使用/usr/bin/Python而不是/usr/bin/env-Python覆盖shebang

Python2.3 distutils使用/usr/bin/Python而不是/usr/bin/env-Python覆盖shebang,python,distutils,Python,Distutils,我有一个安装在共享开发系统上的包。我希望软件包带来的脚本只对我的用户(或任何其他要求它的人)可用。要安装软件包,我将使用来自软件包目录的以下命令: python setup.py安装--home=~ 到目前为止,这已经完成了我希望它完成的所有事情。它安装我的模块并将脚本放在/home/$(whoami)/bin目录中 但是,它做的一件事是替换脚本文件中的shebang。所以,不要用友好的#/usr/bin/env python,它将其替换为#/usr/bin/python 现在,由于我的软件包仅

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

python setup.py安装--home=~

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

但是,它做的一件事是替换脚本文件中的shebang。所以,不要用友好的
#/usr/bin/env python
,它将其替换为
#/usr/bin/python

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

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

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

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

注意:不,在这种设置下,我无法控制Python的版本。在可预见的未来,它是2.3.4版本。

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

如果--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中一定有类似的东西,即使同一个开关不完全像那样存在。

太好了。我会查一下,但是你知道如何只对脚本文件进行这种后处理吗?我根据你所说的“只对脚本文件”更新了答案。我求助于在主机系统上使用sed,因为在我看来这是最简单的方法(而不是使用Python的fileinput模块或转储行列表,更改一行,然后将整个文件写回,等等)。事实上,由于它的sed,它只会更改坏hashbang的精确匹配,因此传递所有已安装的文件是安全的。它在2.3版中不可用……我在python文档中看到了它,并感到兴奋,直到我发现它不起作用。您知道,在这种情况下使用sed是完全过分的,因为shebang行只能出现在文件的第一行。似乎该方法只会修复包中已经存在的脚本的shebang行;而不是安装它们的脚本。不过,谢谢你的帮助。我想你不会明白这里发生了什么。setup()执行实际的复制和hashbang重写。这一行完成后,安装就完成了,文件也就位了——就像永久复制到文件系统一样。之后的一切都由你决定。因此,如果您向fix_hashbang()提供一个包含已损坏hashbang的脚本的文件路径列表,它们将在此时修复,而不是在原始包中。无论如何,我不认为sed在考虑其他选择时是过分的;这对讨论没有任何补充。以编程方式修复列表中的每个脚本并不简单。因为--home参数是作为参数传递给setup.py的,所以我首先必须自己解析它。然后使用它为每个脚本构建一个路径。到那个时候,在安装程序复制脚本之后,自己尝试操作脚本是毫无意义的;我可以自己移动它们,不使用脚本参数。不管怎样,没有一条干净、优雅的前进道路,在python脚本中使用命令行sed也不是。