给出一组python程序:
/tool/a.py
/tool/b.py
/tool/c.py
/tool/d.py
...
存储在共享网络目录中,在混合环境(Solaris和不同版本的Linux)中执行,并且都需要特定的python版本,这些版本可能不在用户$ PATH中,并且可能不会安装在同一个版本中在不同类型的机器上的位置。
程序如何指定要使用的python解释器?
我考虑的替代方案:
每个python程序中的一个shebang,向一个python包装器裁判,为当前类型的机器启动一个合适的python解释器。但是execve不允许将包装器可执行文件实现为shell脚本,并且为每台机器编译本机可执行文件需要大量维护。
为每个python程序创建一个启动shell脚本。所有shell脚本都可以共享相同的逻辑来选择python解释器,但是如果可能的话,我想避免为每个python程序使用单独的shell脚本。
进行某种破解,使每个程序都可以作为shell脚本和python程序运行,类似于:
"""exec" /tool/python_wrapper "$0" "$@" """#" def foo(): print "foo" foo()
你还有其他想法吗?
答案 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.它会有一个小的启动延迟,但它是最灵活的选项。
一个不行,因为你在混合环境中运行,所以正确设置一切将是一场噩梦。
可行,但正如您所说,您需要同时维护.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):