Python:运行时 shebang 问题

Python: runtime shebang problems

这是我要解决的问题。我在标题中没有具体的问题,因为我什至不知道我需要什么。

我们有一个古老的 Hadoop 计算集群,其中安装了非常旧的 Python 版本。我们所做的是将新版本 (2.7.9) 安装到对整个集群可见的本地目录(我们对其具有权限),并拥有一个包含我们需要的包的 virtualenv。我们称此路径为 /n/2.7.9/venv/

我们正在使用 Hadoopy 在集群上分发 Python 作业。 Hadoopy 将 python 代码(映射器和缩减器)分发到集群,这些代码被假定为可执行并带有一个 shebang,但它不会执行任何操作,例如激活 virtualenv。

如果我硬编码 .py 文件中的 shebang /n/2.7.9/venv/,一切正常。但是我想把 .py 文件放在一个库中;这些文件应该有一些通用的 shebang,比如 #!/usr/bin/env python。但是我尝试了这个但它不起作用,因为在 运行 时脚本不是 "activated" virtualenv,因此它会因导入错误而爆炸。

因此,如果有人对如何解决这个问题有任何想法,我将不胜感激。本质上,我希望 #!/usr/bin/env python/n/2.7.9/venv/ 不处于活动状态的情况下解析为 /n/2.7.9/venv/,或者我无法对 shebang 进行硬编码的其他解决方案。

目前我正在解决这个问题,方法是在库中有一个 run 函数,并在主代码(调用库)中围绕这个函数放置一个包装器,其中包含硬编码的 shebang。这不太令人反感,因为硬编码的 shebang 在主代码中是有意义的,但它仍然很混乱,因为我必须有一个可执行的包装文件来围绕我想从库中 运行 的每个函数。

我会更改环境变量PYTHONPATH and also the environment variable PATH。将 PYTHONPATH 指向您的虚拟环境,将 PATH 指向包含您的新 python 可执行文件的目录,并确保您的 python 可执行文件的路径在前面。

我接受了 John Schmitt 的回答,因为它引导我找到了解决方案。但是,我发布的是我实际所做的,因为它可能对其他 Hadoopy 用户有用。

我实际做的是:

args['cmdenvs'] = ['export VIRTUAL_ENV=/n/2.7.9/ourvenv','export PYTHONPATH=/n/2.7.9/ourvenv', 'export PATH=/n/2.7.9/ourvenv/bin:$PATH']

并将 args 传递给 Hadoopy 的 launch 函数。在可执行 .py 文件中,我放置了通用的 #!/usr/bin/env python shebang。