以下是我要解决的问题。我在标题中没有具体问题,因为我甚至不知道我需要什么。
我们有一个古老的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文件放在库中;这些文件应该有一些像#!/usr/bin/env python
这样的通用shebang。但我尝试了这个并且它不起作用,因为在运行时,virtualenv不会被脚本“激活”,因此它会导致导入错误。
所以,如果有人对如何解决这个问题有任何想法,我将不胜感激。基本上我希望#!/usr/bin/env python
在没有/n/2.7.9/venv/
活动的情况下解析为/n/2.7.9/venv/
,或者我无法对shebang进行硬编码的其他解决方案。
目前我通过在库中使用run
函数解决此问题,并在主代码(调用库)中使用硬编码的shebang将此函数包装在其中。这样做不那么冒犯,因为硬编码的shebang在主代码中很有意义,但它仍然很混乱,因为我必须在我想从库中运行的每个函数周围都有一个可执行的包装器文件。
答案 0 :(得分:2)
我会更改环境变量PYTHONPATH以及环境变量PATH。将PYTHONPATH
指向您的虚拟环境,将PATH
指向包含新python可执行文件的目录,并确保首先显示指向python可执行文件的路径。
答案 1 :(得分:1)
我接受了约翰施密特的回答,因为它引导我找到解决方案。但是,我发布了我实际执行的操作,因为它可能对其他Hadoopy用户有用。
我实际做的是:
Dropbox.choose({
success: function (files) {
var xhr = new XMLHttpRequest();
xhr.open('GET', files[0].link);
xhr.responseType = 'arraybuffer';
xhr.onreadystatechange = function (oEvent) {
if (xhr.readyState === 4 && xhr.status === 200) {
var buffer = xhr.response;
console.log('File size: ' + files[0].bytes +
' | Buffer size: ' + buffer.byteLength +
' | Header size: ' + xhr.getResponseHeader('Content-Length'));
}
};
xhr.send();
},
linkType: 'direct'
});
并将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']
传递给Hadoopy的args
函数。在可执行文件.py文件中,我放了通用launch
shebang。