这是我要解决的问题。我在标题中没有具体的问题,因为我甚至不知道我需要什么。在
我们有一个古老的Hadoop计算集群,安装了非常旧的Python版本。我们所做的是将一个新版本(2.7.9)安装到对整个集群可见的本地目录(我们有perms),并有一个virtualenv和我们需要的包。{path>调用这个}
我们使用Hadoopy在集群上分发Python作业。Hadoopy将python代码(mapper和reducer)分发到集群,这些代码假定是可执行的,并带有shebang,但它没有像激活virtualenv那样做任何事情。在
如果我将.py文件中的shebang硬编码到/n/2.7.9/venv/
,那么一切都正常。但是我想把.py文件放在一个库中;这些文件应该有一些通用的shebang,比如#!/usr/bin/env python
。但是我尝试了这个方法,但是它不起作用,因为在运行时,virtualenv没有被脚本“激活”,因此它会产生导入错误。在
因此,如果有人对如何解决这个问题有任何想法,我将不胜感激。本质上,我希望#!/usr/bin/env python
在不激活/n/2.7.9/venv/
的情况下解析成{
目前,我正在解决这个问题:在库中有一个run
函数,并在主代码(调用库)中用硬编码shebang对该函数进行包装。这不那么令人讨厌,因为硬编码的shebang在主代码中是有意义的,但它仍然很混乱,因为我必须在每个要从库中运行的函数周围有一个可执行的包装文件。在
我将更改环境变量PYTHONPATH以及环境变量PATH。将
PYTHONPATH
指向虚拟环境,PATH
指向包含新的python可执行文件的目录,并确保python可执行文件的路径位于第一位。在我接受了约翰·施密特的回答,因为这让我找到了解决办法。不过,我发布的是我实际所做的,因为它可能对其他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
函数中。在executable.py文件中,我将泛型#!/usr/bin/env python
shebang放入。在相关问题 更多 >
编程相关推荐