Как определить процессы параллельного Python, в какой папке искать модули?

Я работаю на компьютерном кластере, на котором установлен NumPy 1.4.1 в обычной папке (/usr/lib64/....). Поскольку я хочу использовать NumPy 1.7.0, я установил его /.../myPath, и добавил export PYTHONPATH=/.../myPath к моему .bashrcтак, что используя import numpy автоматически загрузит NumPy 1.7.0. Это прекрасно работает, за исключением особенности при использовании параллельного питона. Чтобы загрузить правильный модуль 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 ответ

Решение

Учитывая ваше конкретное требование отличия от пользовательских и общесистемных модулей с определенным пакетом, я бы порекомендовал посмотреть на настройку 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)

Это поможет избавить от необходимости внедрения пути.

Другие вопросы по тегам