【问题标题】:How to start python programs with appropriate python version?如何使用适当的 python 版本启动 python 程序?
【发布时间】:2011-06-09 19:26:13
【问题描述】:
给定一组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 脚本。
进行某种 hack,使每个程序都可以作为 shell 脚本和 python 程序运行,类似于:
"""exec" /tool/python_wrapper "$0" "$@" """#"
def foo():
print "foo"
foo()
您还有其他想法吗?
【问题讨论】:
标签:
python
bash
wrapper
shebang
execve
【解决方案1】:
我知道这不是您要寻找的答案,但我只需确保 python 可执行文件位于 PATH 中,然后使用 env 找到它们。从长远来看,我认为这会少很多维护和头痛。例如
#!/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!"
【解决方案2】:
我会选择选项 3。它的启动延迟会很小,但它是最灵活的选项。
一个行不通,因为您在混合环境中运行,正确设置所有内容将是一场噩梦。
可以,但正如您所说,您需要同时维护 .py 程序和 shell 脚本。也和 3 没有太大区别。
【解决方案3】:
我会执行选项#1 并使用env 来绕过解释器限制。请注意,Python 可能已经在 /usr/bin 中创建了特定于版本的二进制文件(它在我的系统上创建了):
#!/usr/bin/env python2.4
或者
#!/usr/bin/env python2.6
【解决方案4】:
您可以通过将 .py 文件参数提供给 Python 二进制文件来直接强制 Python 解释器:
python2.6 /tool/a.py
python2.4 /tool/b.py
为您要使用 virtualenv 的每个工具维护不同的 Python 环境和不同的依赖项(Python 鸡蛋或本机扩展):
http://pypi.python.org/pypi/virtualenv