这是我想要解决的问题。我在标题中没有具体的问题,因为我甚至不知道我需要什么。
我们有一个古老的Hadoop计算集群,安装了一个非常老版本的Python。我们所做的是将一个新版本(2.7.9)安装到对整个集群可见的本地目录(我们已经对其进行了遍历),并使用我们需要的包安装了一个virtualenv。让我们把这个路径称为/n/2.7.9/venv/
我们使用Hadoopy在集群上分发Python作业。Hadoopy将python代码(映射器和还原程序)分发到集群中,这些代码被假定是可执行的,并附带了一个shebang,但它不会执行任何类似于激活虚拟服务器的操作。
如果我将.py文件中的shebang硬编码为/n/2.7.9/venv/,那么一切都正常。但是我想把.py文件放在一个库中;这些文件应该有一些通用的shebang,比如#!/usr/bin/env python。但是我尝试了这一点,但是它不起作用,因为在运行时,virtualenv不是由脚本“激活”的,因此它用导入错误进行轰炸。
因此,如果有人对如何解决这一问题有任何想法,我将不胜感激。本质上,我希望#!/usr/bin/env python能够在不激活/n/2.7.9/venv/的情况下解析为/n/2.7.9/venv/,或者其他一些解决方案,在这种解决方案中,我无法硬编码shebang。
目前,我正在解决这个问题,方法是在库中有一个run函数,并在主代码(调用库)中放置一个包装器,其中包含硬编码的shebang。这不那么令人讨厌,因为硬编码的shebang在主代码中是有意义的,但是它仍然很混乱,因为我必须在我想要从库中运行的每个函数周围都有一个可执行包装文件。
发布于 2015-08-20 16:59:58
发布于 2015-08-20 18:01:25
我接受了约翰·施密特的回答,因为它使我找到了解决办法。但是,我正在发布我实际做过的事情,因为它可能对其他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传递给哈多比的launch函数。在可执行的.py文件中,我将泛型#!/usr/bin/env python放进去。
https://stackoverflow.com/questions/32123775
复制相似问题