Python使用PYTHONPATH环境变量来确定它应该在哪些文件夹中查找模块.您可以通过修改来解决它sys.path,它可以很好地用于纯Python模块.但是当一个模块使用共享对象文件或静态库时,它会在LD_LIBRARY_PATH(在linux上)查找它们,但是根据我所知,这不能轻易改变并且是平台相关的.
这个问题的快速修复当然是设置环境变量或调用脚本LD_LIBRARY_PATH=. ./script.py,但是你必须为你打开的每个新shell再次设置它.此外,.so我的情况下的文件将始终与文件位于同一目录中.py,但很可能会移动到另一个绝对路径,所以我想每次调用脚本时自动设置它们.
如何编辑Python解释器在运行时独立查找库平台的路径?
我已经尝试过os.environ['LD_LIBRARY_PATH'] = os.getcwd(),但无济于事.
是否有可能改变当前流程的环境变量?
更具体地说,我想改变python脚本,LD_LIBRARY_PATH以便在导入依赖于某些模块的模块'x'时xyz.so,xyz.so取自LD_LIBRARY_PATH中的给定路径
有没有其他方法动态更改库加载的路径?
编辑:我想我需要提一下,我已经尝试过像os.environ这样的东西["LD_LIBRARY_PATH"] = mypath os.putenv('LD_LIBRARY_PATH',mypath)
但这些修改了env.对于生成的子进程,而不是当前进程,并且模块加载不考虑新的LD_LIBRARY_PATH
Edit2,所以问题是我们可以改变环境或其他东西,以便库加载器看到它并从那里加载吗?
有没有办法在运行时设置指定Python查找共享库?
我fontforge.so找到了fontforge_bin并尝试了以下内容
os.environ['LD_LIBRARY_PATH']='fontforge_bin'
sys.path.append('fontforge_bin')
import fontforge
Run Code Online (Sandbox Code Playgroud)
得到
ImportError: fontforge_bin/fontforge.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这样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)
Run Code Online (Sandbox Code Playgroud) 我在Apache2上使用mod_wsgi在ubuntu上部署我的Django网站.
在我的Django视图中,我导入了一个需要在LD_LIBRARY_PATH中设置特定路径的模块.
当我在/ etc/apache2/envvars中设置LD_LIBRARY_PATH时:
export LD_LIBRARY_PATH=/home/user/target_libdir:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
有用.
但是,在我的服务器上,我使用独立的wsgi脚本运行多个django网站,每个网站都在独立的VirtualHost条目中.
问题是网站需要使用不同的LD_LIBRARY_PATH版本.
那么,如何为每个django网站单独设置LD_LIBRARY_PATH?
我正在尝试按照我在网上找到的说明(包括以下答案)从 Cython 链接到我自己的 C 库:
我正在通过 Spyder 运行 IPython。
我的 setup.py 看起来像这样:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy as np
setup(
ext_modules = cythonize(
[Extension("*",["*.pyx"],
libraries =["MyLib"],
extra_compile_args = ["-fopenmp","-O3"],
extra_link_args=["-L/path/to/lib"])
]),
include_dirs = [np.get_include()],
)
Run Code Online (Sandbox Code Playgroud)
文件libMyLib.so在里面/path/to/lib,它编译得很好。
我的 IPython 配置文件启动文件夹中有一个 Python 脚本可以执行此操作
try:
os.environ["LD_LIBRARY_PATH"] += ":/path/to/lib"
except KeyError:
os.environ["LD_LIBRARY_PATH"] = "/path/to/lib"
Run Code Online (Sandbox Code Playgroud)
我可以确认这正在运行,因为如果我输入os.environ["LD_LIBRARY_PATH"]IPython 解释器,它会返回/path/to/lib
但是当我尝试加载 Cython 模块(即import mycythonmodule)时,我得到:
ImportError: …Run Code Online (Sandbox Code Playgroud)