有没有办法在运行时中设置指定,其中Python查找共享库?
我fontforge.so
位于fontforge_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
在ldd
上执行fontforge_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)
答案 0 :(得分:17)
您的脚本可以在导入模块之前检查环境变量是否存在/正确,然后在os.environ中设置它(如果缺少),然后调用os.execv()以使用相同的方式重新启动python解释器命令行参数,但是一组更新的环境变量。
这只是之前之前的任何其他导入(os和sys除外),因为潜在的模块导入副作用,如打开的文件描述符或套接字,这可能很难干净地关闭。
此代码设置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作业文件中)可能更简洁。
答案 1 :(得分:9)
...你可以通过ctypes加载你选择的某个文件夹中的所有库,从而使它们可用,无论LD_LIBRARY_PATH如何。
from ctypes import *
lib1 = cdll.LoadLibrary('/home/username/lib/some_library.so')
或者遍历那个目录中的文件...你明白了,一旦加载它就在那里[如果依赖关系也超出你应该加载它们的默认路径......]。< / p>
答案 2 :(得分:6)
LD_LIBRARY_PATH
设置动态链接器路径;通常不能在运行时更改,因为它通常由动态链接器缓存。
但这不是Python寻找导入的地方,包括模块导入。更改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'
(顺便说一句,您可能希望在库中查看库中是否有任何奇怪的导入路径。“ImportError:fontforge_bin / fontforge.so”看起来很奇怪。)