1

给定一组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. 进行某种 hack 以使每个程序都可以作为 shell 脚本和 python 程序运行,类似于:

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

你还有其他想法吗?

4

4 回答 4

4

我知道这不是您正在寻找的答案,但我只是确保 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!"
于 2011-06-09T19:34:50.173 回答
1

我会做选项 #1 并env用来绕过解释器的限制。请注意,Python 可能已经创建了特定于版本的二进制文件/usr/bin(它在我的系统上创建了):

#!/usr/bin/env python2.4

或者

#!/usr/bin/env python2.6
于 2011-06-09T19:36:01.443 回答
1

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

  1. 一个是行不通的,因为您在混合环境中运行,正确设置所有内容将是一场噩梦。

  2. 可以,但是,正如您所说,您需要同时维护 .py 程序和 shell 脚本。也和3没有太大区别。

于 2011-06-09T19:29:49.067 回答
1

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

python2.6 /tool/a.py

python2.4 /tool/b.py

要为您要使用 virtualenv 的每个工具维护不同的 Python 环境和不同的依赖项(Python 鸡蛋或本机扩展):

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

于 2011-06-09T19:45:12.407 回答