Python:ctypes CDLL('library.so')未找到指定的模块

时间:2018-02-07 23:38:48

标签: python c++ python-3.x shared-libraries ctypes

我试图在python3中使用一个简单的C ++函数。 在教程之后我构建了一个共享库(“。so”),并尝试使用ctypes.CDLL()函数在python中调用funktion。

编译.cpp并执行.py在命令行上运行良好,但当我将所有文件复制到IDE(在我的情况下为PyCharm)并从那里运行代码时,我收到错误:

Traceback (most recent call last):
  File ".../test/wrapper.py", line 26, in <module>
    test = ctypes.CDLL('library.so').foo_bar_function(a, b)
  File "...\AppData\Local\Programs\Python\Python36\lib\ctypes\__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] The specified module was not found

我已经尝试过指定library.so的完整路径,但没有运气。

我知道有一些工具集作为Boost.Python库,可以帮助扩展python与c / c ++函数。但由于功能不需要任何特殊功能,只是“静态”方法并且非常简单,我想我不必经历那个麻烦。我的所有功能应该是从python获取一些数组,用简单的操作操作数组并返回一个int。

我做了什么:

  • 创建了两个文件:

    ... /测试/ function.cpp ... /测试/ wrapper.py

function.cpp:

#include <valarray>

bool foo_function(const std::valarray<float> &a, const int b) {
    float f = 0.0;
    std::valarray<float> above = a[a < f];
    return above.size() >= b;
}

int bar_function(const std::valarray<float> &a, const int b) {
    bool b = foo_function(a,b[0]);
    ... SOME OTHER CODE ...
    return 0;
}

extern "C" int foo_bar_function(float *a, int *b, int c) {
    std::valarray<float> v (a, c);
    ... SOME OTHER CODE ...
    int i = bar_function(v, b);
    return i;
}

和wrapper.py

import ctypes

py_a = [10,5,6,2,1,1,1,6,3,1]
c_a = (ctypes.c_float * len(py_a))(*py_a)

py_b = [1,1,2]
c_b = (ctypes.c_int * len(py_b))(*py_b)

test = ctypes.CDLL('library.so').foo_bar_function(c_a, c_b)

print(test)

然后我跑了:

...\test> g++ -shared -c -fPIC function.cpp -o function.o
...\test> g++ -shared -Wl,-soname,library.so -o library.so function.o
...\test> python wrapper.py
0 (expected output from c++ function)

所以在cmd内所有都按预期进行。

我还能尝试什么?

0 个答案:

没有答案