0

我正在一个计算机集群上工作,它在通常的文件夹 (/usr/lib64/....) 中安装了 NumPy 1.4.1。因为我想使用 NumPy 1.7.0,所以我已经安装了它/.../myPath,并添加export PYTHONPATH=/.../myPath到我的.bashrc,这样使用import numpy将自动加载 NumPy 1.7.0。这工作正常,除了使用并行 python时的特殊性。为了在每个进程中加载​​正确的 NumPy 模块,我修改sys.path了 ,因为这些进程似乎忽略了该$PYTHONPATH变量:

import pp
import numpy

def try2():
  sys.path.insert(0,'/.../myPath')
  import numpy
  a=numpy.random.rand(4,4)
  return numpy.__version__

print numpy.__version__

job_server = pp.Server(2, ppservers=() )
jobs=[job_server.submit(try2,(),(),("sys",)),job_server.submit(try2,(),(),("sys",))]
for job in jobs:
  print job()

输出如所愿:

1.7.0
1.7.0
1.7.0

但是,当我用这样的ndarray参数调用它时

import pp
import numpy

def try2(a):
  sys.path.insert(0,'/.../myPath')
  import numpy
  return numpy.__version__

print numpy.__version__

a=numpy.random.rand(4,4)
job_server = pp.Server(2, ppservers=() )
jobs=[job_server.submit(try2,(a,),(),("sys",)),job_server.submit(try2,(a,),(),("sys",))]
for job in jobs:
  print job()

输出变为

1.7.0
1.4.1
1.4.1

我的解释:子进程一被调用就会收到一个参数,因此在我有机会修改之前numpy.ndarray搜索一个名为的模块。有想法该怎么解决这个吗?numpysys.path

4

1 回答 1

1

鉴于您在给定某个包的情况下与用户和系统范围的模块区分开来的特殊要求,我建议您考虑设置virtualenv以在隔离环境中运行您的所有代码(引用链接):

sudo pip install virtualenv
(or, sudo easy_install virtualenv if you don’t use pip)
(or, easy_install --install-dir ~/site-packages/ virtualenv on a shared host)
mkdir ~/virtualenvs   (a directory for your isolated environments)
virtualenv ~/virtualenvs/mysite.com --no-site-packages
(--no-site-packages isolates your environment from the main site-packages directory)
cd ~/virtualenvs/mysite.com/bin
source activate  (activates your new environment)

这将有助于节省路径注入的需要。

于 2013-03-06T17:55:42.467 回答