web-dev-qa-db-ja.com

現在のプロセス環境のLD_LIBRARY_PATHを変更します

現在のプロセスの環境変数を変更することは可能ですか?

より具体的には、pythonスクリプトで、LD_LIBRARY_PATHを変更して、xyz.soに依存するモジュール 'x'をインポートすると、xyz.soがLD_LIBRARY_PATHの指定されたパスから取得

ライブラリがロードされている場所からパスを動的に変更する他の方法はありますか?

編集:os.environ ["LD_LIBRARY_PATH"] = mypath os.putenv( 'LD_LIBRARY_PATH'、mypath)のようなものをすでに試したことに言及する必要があると思います

しかし、これらは環境を変更します。現在のプロセスではなく、生成されたサブプロセスの場合、モジュールのロードでは新しいLD_LIBRARY_PATHは考慮されません。

Edit2では、ライブラリローダーがそれを認識してそこからロードするように環境などを変更できるかどうかという質問があります。

23
Anurag Uniyal

理由

os.environ["LD_LIBRARY_PATH"] = ...

動作は単純ではありません。この環境変数はダイナミックローダー(Linuxではld-linux.so.2、Solarisではld.so.1)の動作を制御しますが、ローダーはプロセスの起動時にLD_LIBRARY_PATHを1回だけ確認します。現在のプロセスでLD_LIBRARY_PATHの値を変更してもafterそのポイントは効果がありません( this の質問に対する答えが言うように)。

いくつかのオプションがあります:

A. xyz.soから/some/pathが必要であり、最初からpythonスクリプトの実行を制御する必要があることがわかっている場合は、LD_LIBRARY_PATHを好みに合わせて設定します(まだ実行されていないことを確認した後)そのように設定)、そして自分自身を再実行します。これはJavaが行うことです。

B.絶対パスを介して/some/path/xyz.soをインポートできますbeforex.soをインポートします。次にx.soをインポートすると、ローダーはxyz.soが既にロードされていることを検出し、再度検索する代わりに、すでにロードされているモジュールを使用します。

C. x.soを自分でビルドする場合は、リンク行に-Wl,-rpath=/some/pathを追加してから、x.soをインポートすると、ローダーは/some/path内の依存モジュールを検索します。

34

雇用されたロシア人からの回答に基づいて、これは私のために働くものです

Oracle_libs = os.environ['Oracle_HOME']+"/lib/"
rerun = True

if not 'LD_LIBRARY_PATH' in os.environ:
  os.environ['LD_LIBRARY_PATH'] = ":"+Oracle_libs
Elif not Oracle_libs in os.environ.get('LD_LIBRARY_PATH'):
  os.environ['LD_LIBRARY_PATH'] += ":"+Oracle_libs
else:
  rerun = False

if rerun:
  os.execve(os.path.realpath(__file__), sys.argv, os.environ)
11
cristi