用cffi加载.so库

时间:2017-11-27 10:14:02

标签: python python-cffi

我想要使用CFFI在Python中访问一些C库。构建库后,我得到了2个文件:Sub getdatafromaccesstoanarray() Dim cn As Object 'Connection Dim rs As Object 'Recordset Dim vAry() As Variant 'Variant Array Dim dbPath As String 'Database Path Dim dbName As String 'Database Name Dim txt As String Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") dbPath = ThisWorkbook.Path & "\" dbName = "NewDB.accdb" cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & dbPath & dbName & ";" rs.Open "SELECT * FROM BILLDETAILS WHERE BILLDETAILS.SN_AUTO =100;", cn vAry = rs.GetRows() 'now when the data is copied to my array how can i paste specific values from this data to 'cells in my excel sheet 'like 'on active sheet '[a1] = vAry(value1) '[a2] = vAry(value3) '[a3] = vAry(value8) 'and other values like wise rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub $HOME/libcint/include/cint.h

现在我尝试了CFFI API模式:

$HOME/libcint/lib/libcint.so

但它无法找到from cffi import FFI libcint_dir = os.path.expanduser('~/libcint') ffibuilder = FFI() ffibuilder.set_source('_libcint', r'#include <include/cint.h>', include_dirs = [libcint_dir], libraries = ['libcint'], library_dirs = [os.path.join(libcint_dir, 'lib')], ) 文件:

libcint.so

/usr/bin/ld: cannot find -llibcint 中的路径是正确的,因为我没有收到有关未找到头文件的任何错误消息。此外,我设法使用libcint_dir模块成功连接库,因此ctypes本身应该没问题。

我在这里做错了什么?

如果我说得对,那么这里需要3个步骤。 (请纠正我,如果我在这里感到困惑。)

  1. 编译libcint,产生libcint.so
  2. 使用CFFI构建Python包装器
  3. 将步骤2中构建的模块导入实际的Python程序
  4. 我的问题在于第二步。

2 个答案:

答案 0 :(得分:3)

您说libraries = ['libcint'],这意味着编译器将查找名为liblibcint.so的文件。你应该写的是libraries = ['cint']

答案 1 :(得分:0)

您可能会被库的编译时间与运行时位置问题所困扰。您提供给库的路径仅在GCC编译时使用。在运行时,它会查找具有正确名称的库,但仅使用系统配置的默认路径。所以你需要告诉系统在哪里找到那个库。您可以执行以下操作之一:

  • 将库移至标准位置,例如/usr/local/lib;

  • 使用环境变量LD_LIBRARY_PATH=/path/to/library;

  • 运行
  • 如果要对已编译模块内的路径进行硬编码,可以在调用set_source()时使用extra_link_args=['-Wl,-rpath=' + path]

这都是假设Linux。在另一个平台上,所有三个选项都可能也可用,但细节不同......