我试图在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内所有都按预期进行。
我还能尝试什么?