如何告诉parallel-python进程在哪个文件夹中搜索模块?

时间:2013-03-06 17:45:19

标签: python sys parallel-python

我正在开发一个计算机集群,它在通常的文件夹(/ usr / lib64 / ....)中安装了NumPy 1.4.1。由于我想使用NumPy 1.7.0,我已经安装了/.../myPath,并将export PYTHONPATH=/.../myPath添加到.bashrc,这样使用import numpy将自动加载NumPy 1.7.0 。除了使用parallel 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参数,因此在我有机会修改numpy之前搜索名为sys.path的模块。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

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

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)

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