web-dev-qa-db-ja.com

インポート文の前にpythonpathを設定します

私のコードは:

import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

しかし、scriptlibは他のディレクトリにあるため、環境変数「PYTHONPATH」にそのディレクトリを含める必要があります。

とにかく、インポート文が次のように実行される前に、環境変数「PYTHONPATH」にscriptlibディレクトリを最初に追加することができますか?

import sys
sys.path.append('/mypath/scriptlib')
import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

その場合、値はそのコマンドのプロンプトのみですか、それともグローバルですか?

前もって感謝します

51
DKG

これにより、Pythonプロセス/インスタンス(実行中の実行可能ファイル)にパスが追加されます。他のPythonプロセスのパスは変更されません。実行中の別のPythonプログラムのパスは変更されず、プログラムを終了して再度実行した場合、パスには以前に追加したものが含まれません。あなたがしていることは一般的に正しいです。

set.py:

import sys
sys.path.append("/tmp/TEST")

loop.py

import sys
import time
while True:
  print sys.path
  time.sleep(1)

実行:python loop.py &

これにより、STDOUTに接続されたloop.pyが実行され、バックグラウンドで実行が継続されます。その後、python set.pyを実行できます。それぞれに異なる環境変数のセットがあります。 loop.pyset.pyの環境を変更しないため、loop.pyからの出力は変更されないことに注意してください。

インポートに関する注意

Pythonのインポートは、他の言語と同様に動的です。静的リンクは行われていません。インポートは、sys.path.append...と同様に実行可能な行です。

51
Joe

ドキュメントにも記載されているとおり here
Python X.X/Libに移動し、site.pyにこれらの行を追加して、

import sys
sys.path.append("yourpathstring")

これによりsys.pathが変更され、すべてのロードでその値が含まれるようになります。

述べたように ここsite.pyについて、

このモジュールは初期化中に自動的にインポートされます。このモジュールをインポートすると、サイト固有のパスがモジュール検索パスに追加され、いくつかのビルトインが追加されます。

sys.pathにパスを追加する他の可能な方法については、 これらのドキュメント を参照してください

6
pradyunsg