0

私は、NumPy 1.4.1 が通常のフォルダー (/usr/lib64/....) にインストールされているコンピューター クラスターで作業しています。NumPy 1.7.0 を使用したいので、それをインストールし、 NumPy 1.7.0 を自動的にロードするように/.../myPathに追加export PYTHONPATH=/.../myPathしました。これは、並列 pythonを使用する場合の特殊性を除いて、正常に機能します。各プロセスで正しい NumPy モジュールをロードするために、これらのプロセスは変数を無視しているように見えるため、 を変更します。.bashrcimport numpysys.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。これを修正する方法についてのアイデアはありますか?

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 に答える