如何用适当的python版本启动python程序?

时间:2011-06-09 19:26:14

标签: python bash wrapper shebang execve

给出一组python程序:

/tool/a.py
/tool/b.py
/tool/c.py
/tool/d.py
...

存储在共享网络目录中,在混合环境(Solaris和不同版本的Linux)中执行,并且都需要特定的python版本,这些版本可能不在用户$ PATH中,并且可能不会安装在同一个版本中在不同类型的机器上的位置。

程序如何指定要使用的python解释器?

我考虑的替代方案:

  1. 每个python程序中的一个shebang,向一个python包装器裁判,为当前类型的机器启动一个合适的python解释器。但是execve不允许将包装器可执行文件实现为shell脚本,并且为每台机器编译本机可执行文件需要大量维护。

  2. 为每个python程序创建一个启动shell脚本。所有shell脚本都可以共享相同的逻辑来选择python解释器,但是如果可能的话,我想避免为每个python程序使用单独的shell脚本。

  3. 进行某种破解,使每个程序都可以作为shell脚本和python程序运行,类似于:

  4. """exec" /tool/python_wrapper "$0" "$@" """#"
    def foo():
    print "foo"
    foo()
    

    你还有其他想法吗?

4 个答案:

答案 0 :(得分:4)

我知道这不是你想要的答案,但我只是确保python可执行文件在PATH中,然后使用env来查找它们。从长远来看,我认为这将减少维护和头痛。 E.g。

#!/usr/bin/env python2.5
print "Hello from python 2.5!"

#!/usr/bin/env python2.6
print "Hello from python 2.6!"

#!/usr/bin/env python2.7
print "Hello from python 2.7!"

答案 1 :(得分:1)

我会使用选项3.它会有一个小的启动延迟,但它是最灵活的选项。

  1. 一个不行,因为你在混合环境中运行,所以正确设置一切将是一场噩梦。

  2. 可行,但正如您所说,您需要同时维护.py程序和shell脚本。与3相比也没有太大的不同。

答案 2 :(得分:1)

我会选择#1并使用env来解决翻译限制。请注意,Python可能已经在/usr/bin中创建了特定于版本的二进制文件(它在我的系统上完成):

#!/usr/bin/env python2.4

或者

#!/usr/bin/env python2.6

答案 3 :(得分:1)

您可以通过将.py文件参数提供给Python二进制文件来直接强制Python解释器:

python2.6 /tool/a.py

python2.4 /tool/b.py

为每个要使用virtualenv的工具维护不同的Python环境和不同的依赖关系(Python egg或native extension):

http://pypi.python.org/pypi/virtualenv