5

我有许多脚本需要指定运行它们的 python 二进制文件:

#! /home/nargle/python/bin/python2.6

我需要调整这些脚本以在两个不同的站点上工作。许多工具安装在不同的地方,因此在新站点 2 处,脚本需要从以下位置开始:

#! /user/nargle/python/bin/python2.6
..

我想用为每个站点设置不同的环境变量替换直接引用的路径。我想要的是这个工作:

#! $MY_PYTHON_PATH

但事实并非如此!我对在哪里研究这个有点模糊。是检测到“#!”的执行 shell(无论是 bash、csh 还是其他)在脚本的开头(无论是 bash、python 还是其他)并启动解释器/shell 来运行它?

我觉得必须有某种方法可以做到这一点。请指教!

哦,是的,还有一个限制:我们不能为此使用路径。这似乎是一个愚蠢的限制,但这是针对有许多用户的大型环境

环境是 RHEL 5.7。

编辑有人建议使用 shell 脚本,这是当前的计划:它工作正常:

 $MY_PYTHON_PATH some_script file.py $@

问题在于我们有很多人在使用 python 文件,并且有很多需要更改的自动化测试。如果必须这样做,就必须这样做,但如果可能的话,我想尽量减少改变工作方式对许多人的影响。

编辑也可以在两个系统上相同的位置有一个链接,并且链接到每个系统上不同目标中的真实二进制文件。这是相当可行的,但似乎有点混乱:我们使用 linux 的“模块”包来为许多工具设置环境变量,如果我们可以从我们的模块文件中获取 python 路径,那就太好了。

编辑这不是答案,但这感觉就像我正在寻找的那种邪恶黑客:http: //docs.nscl.msu.edu/daq/bluebook/html/x3237.html ..参见“示例4-2 . #! 用于 bash 和 tclsh 的行"

编辑我希望这可能有效,但它没有:

!# /usr/bin/env PATH=$PATH:$MY_PYTHON_PATH python2.6
4

4 回答 4

5

常见的解决方案是将shebang更改为

#!/usr/bin/env python2.6

然后,只需安排您的 $PATH 指向每台机器上正确的 python2.6。

于 2013-01-24T10:08:25.587 回答
2

编写一个包装外壳脚本。如果你有script.py,写一个script.py.sh具有以下内容的:

#!/bin/bash
PYTHON_SCRIPT=$( echo "$0" | sed -e 's/\.sh$//' )
exec $MY_PYTHON_PATH $PYTHON_SCRIPT "$@"

免责声明:这未经测试,只是从我的脑海中写下来。

现在只需在每台机器上设置您的 MY_PYTHON_PATH,然后调用script.py.sh而不是script.py.

总结这个解决方案只是次优的,因为它需要将大量脚本调用从 更改script.pyscript.py.sh,如果可能的话,应该避免这种情况。


选择

用于env调用 python-finder 脚本,该脚本只调用包含在$MY_PYTHON_PATH. python-finder 脚本必须位于两台机器上的相同位置,如有必要,请使用符号链接。

#!/usr/bin/env /usr/local/bin/python-finder.sh

python-finder.sh 的内容:

#!/bin/bash
exec $MY_PYTHON_PATH "$@"

这是有效的,因为对于解释器脚本(以 shebang 开头的那些),execve调用解释器并将文件名传递给 env,然后将其传递给它调用的命令。

于 2013-01-24T13:19:12.223 回答
0

我很傻:对 env 使用变量扩展确实有效。

#! /usr/bin/env PATH="$PATH:$MY_PYTHON_PATH" python2.6
于 2013-01-24T15:10:50.177 回答
0

我们能做的:

#!/bin/bash
"exec" "python" "$0"

print "Hello World"

来自http://rosettacode.org/wiki/Multiline_shebang#Python

于 2013-01-24T16:18:16.577 回答