web-dev-qa-db-ja.com

内部からLD_LIBRARY_PATHを設定するPython

指定を設定する方法はあります実行時ここでPythonは共有ライブラリを探しますか?

fontforge.sofontforge_binがあり、以下を試しました

os.environ['LD_LIBRARY_PATH']='fontforge_bin'
sys.path.append('fontforge_bin')
import fontforge

そして得る

ImportError: fontforge_bin/fontforge.so: cannot open shared object file: No such file or directory

lddfontforge_bin/fontforge.soで実行すると、次のようになります。

linux-vdso.so.1 =>  (0x00007fff2050c000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f10ffdef000)
libc.so.6 => /lib/libc.so.6 (0x00007f10ffa6c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f110022d000)
24

スクリプトは、モジュールをインポートする前に環境変数の存在/プロパティを確認し、不足している場合はos.environに設定し、次に os.execv() を呼び出して=を再起動しますpythonコマンドライン引数は同じですが、環境変数のセットが更新されたインタプリタ。

他のインポート(osおよびsys以外)の前にbeforeをお勧めします。これは、開かれたファイル記述子やソケットなどの潜在的なモジュールインポートの副作用があるためです。 、きれいに閉じるのは難しいかもしれません。

このコードは、LD_LIBRARY_PATHとOracle_HOMEを設定します。

#!/usr/bin/python
import os, sys
if 'LD_LIBRARY_PATH' not in os.environ:
    os.environ['LD_LIBRARY_PATH'] = '/usr/lib/Oracle/XX.Y/client64/lib'
    os.environ['Oracle_HOME'] = '/usr/lib/Oracle/XX.Y/client64'
    try:
        os.execv(sys.argv[0], sys.argv)
    except Exception, exc:
        print 'Failed re-exec:', exc
        sys.exit(1)
#
# import yourmodule
print 'Success:', os.environ['LD_LIBRARY_PATH']
# your program goes here

開始環境の一部として(親プロセスまたはsystemd/etcジョブファイルで)その環境変数を設定する方がおそらくクリーンです。

19
Will Pierce

...まあ、ctypesを介して選択したフォルダからすべてのライブラリをロードし、LD_LIBRARY_PATHに関係なくそれらを使用できるようにすることもできます。

from ctypes import *
lib1 = cdll.LoadLibrary('/home/username/lib/some_library.so')

または、そのディレクトリ内のファイルを反復処理します...アイデアが得られたら、それがロードされるとそこに表示されます(依存関係もデフォルトのパスと異なる場合は、それらもロードする必要があります...]。

11
pawelmech

LD_LIBRARY_PATHは動的リンカーパスを設定します。通常はダイナミックリンカーによってキャッシュされるため、通常は実行時に変更できません。

Pythonがimportsを探す場所ではありませんが、モジュールのインポートを含みます。sys.path 正しい。

# ls foo/
_csv.so
# python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48)
>>> import sys
>>> sys.path.insert(0, "foo")
>>> import _csv
>>> _csv.__file__
'foo/_csv.so'

(ちなみに、ライブラリをlddして、ライブラリに奇妙なインポートパスがあるかどうかを確認することもできます。「ImportError:fontforge_bin/fontforge.so」は奇妙に見えます。)

6
Glenn Maynard