現在のプロセスの環境変数を変更することは可能ですか?
より具体的には、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では、ライブラリローダーがそれを認識してそこからロードするように環境などを変更できるかどうかという質問があります。
理由
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
内の依存モジュールを検索します。
雇用されたロシア人からの回答に基づいて、これは私のために働くものです
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)