python使用CDLL加载c lib,在python路径中看不到库

teh*_*rus 7 python ctypes lammps

我正在努力让一些开源学术代码工作(项目主页在这里).它是一个很大的C++代码库,带有(非常)瘦的python包装器,用于CDLL加载C++并调用一些可用的C函数来允许代码的原始python脚本.

但是,初始导入代码崩溃,因为它无法在site-packages中找到它旁边的.so文件:

在已安装的文件中:

from ctypes import *

try:
  self.lib = CDLL("_lammps.so")
except:
  try:
    self.lib = CDLL("_lammps_serial.so")
  except:
    raise OSError,"Could not load LAMMPS dynamic library"
Run Code Online (Sandbox Code Playgroud)

并在脚本或解释器中:

from lammps import lammps
l = lammps()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lammps.py", line 42, in __init__
    raise OSError,"Could not load LAMMPS dynamic library"
OSError: Could not load LAMMPS dynamic library
Run Code Online (Sandbox Code Playgroud)

其他的答案似乎已经本公约所涵盖的,但如果这只能CDLL()是在脚本中调用实际调用(或跑解释提示的工作目录) -即如果"相对路径"是在用户空间,而不是蟒蛇库空间.

我们如何可靠地安装导入我们自己构建的C/C++库?没有污染系统库位置,如/usr/lib不是非常pythonic,我看不到一个简单的解决方案.

(编辑:更正的函数名称,不明确的重构无益!抱歉!)

Jos*_*ein 5

我在 linux 上,我为解决这个问题所做的一切都放在了 os 模块的绝对路径中,并且可以正常工作

from ctypes import *
import os

xss = cdll.LoadLibrary(os.path.abspath("libxss.so.1"))
print xss.xss_test_1()
Run Code Online (Sandbox Code Playgroud)

这也是python 2.7。


Dim*_*nek 3

在 strace -eopen 下运行,你会看到类似这样的内容:

open("tls/x86_64/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("tls/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("x86_64/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("_lammps.so", O_RDONLY|O_CLOEXEC)  = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 6
open("/lib/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

它显示了 python ctypes 查找您的库的所有位置。到目前为止,我无法找到运行时环境变量调整来使其在我的系统上添加搜索位置,也许您必须使用绝对路径。