有没有一种方法可以在运行时设置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
在fontforge_bin/fontforge.so
上执行ldd
给出以下内容
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)
您的脚本可以在导入模块之前检查环境变量的存在/正确性,然后在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作业文件中)可能更清洁。
…你可以通过ctypes从你选择的某个文件夹中加载所有库,从而使它们可用于你,而不管LD_LIBRARY_PATH。
from ctypes import * lib1 = cdll.LoadLibrary('/home/username/lib/some_library.so')
或迭代该目录中的文件…你会得到这个想法,一旦它被加载,它就在你身边[如果依赖也超出了默认路径,你也应该加载它们…]。
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”看起来很奇怪。)