如何在运行时更新此环境变量,以便ctypes可以在任何地方加载库?我尝试了以下,似乎都没有工作.
from ctypes import *
os.environ['LD_LIBRARY_PATH'] = "/home/starlon/Projects/pyCFA635/lib"
os.putenv('LD_LIBRARY_PATH', "/home/starlon/Projects/pyCFA635/lib")
lib = CDLL("libevaluator.so")
Run Code Online (Sandbox Code Playgroud) 是否有可能改变当前流程的环境变量?
更具体地说,我想改变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) 当显式调用脚本时python,它会argv被删除,因此这argv[0]是运行脚本的路径.如果被调用为python foo/bar.py甚至如此,就是这种情况python -m foo.bar.
我需要一种方法来恢复原始argv(即收到的原始python).不幸的是,它并不像前面那样容易sys.executable,sys.argv因为python foo/bar.py它不同于python -m foo.bar(隐式的PYTHONPATH不同,这可能是至关重要的,具体取决于你的模块结构).
更具体地说,在python foo/bar.py some other args和的情况下python -m foo.bar some other args,我正在寻找恢复['python', 'foo/bar.py', 'some', 'other', 'args']和['python', '-m', 'foo.bar', 'some', 'other', 'args']分别.
我知道之前的问题:
但是这些似乎误解了炮弹是如何运作的,而答案却反映了这一点.我没有兴趣在解开外壳的工作(如评估壳VAR和功能都很好),我只是想在原来的argv给予python.
我发现的唯一解决方案是使用/proc/<PID>/cmdline:
import os
with open("/proc/{}/cmdline".format(os.getpid()), 'rb') as f:
original_argv …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照我在网上找到的说明(包括以下答案)从 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) 我在Linux Mint 18上运行Python 3.5.我想加载pypyodbc模块.但是,无论我尝试什么,我总是得到错误:
Run Code Online (Sandbox Code Playgroud)OdbcNoLibrary: 'ODBC Library is not found. Is LD_LIBRARY_PATH set?'
在使用python导入之前设置LD_LIBRARY_PATH我得到了设置路径的建议os.getcwd(),但它也没有工作,并给了我同样的错误.
我应该安装什么才能使它工作?
查看错误的完整日志:
In [1]: import pypyodbc
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
/home/me/env/lib/python3.5/site-packages/pypyodbc.py in <module>()
426 # First try direct loading libodbc.so
--> 427 ODBC_API = ctypes.cdll.LoadLibrary('libodbc.so')
428 except:
/usr/lib/python3.5/ctypes/__init__.py in LoadLibrary(self, name)
424 def LoadLibrary(self, name):
--> 425 return self._dlltype(name)
426
/usr/lib/python3.5/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
346 if handle is None:
--> 347 self._handle = …Run Code Online (Sandbox Code Playgroud)