ctypes 自己的库加载但无法访问 functions/methods
ctypes own library loads but can't access functions/methods
我正在尝试编写一个 c 例程来加速 python 脚本。
为了路由证明我的方法我先写了一个简短的测试c函数并将它编译成一个库:测试函数的代码是:
void cttest(void);
#include <stdio.h>
void cttest()
{
printf("This is the shared module|n");
return;
}
我将这段代码保存到一个文件中 'ct_test.cc'。
然后我将这段代码编译如下:
g++ -shared -fPIC -o /home/paula/libs/libcttest.so ct_test.cc
没有给出错误或警告。
然后我加载了 ipython 并输入了以下内容:
import ctypes as ct
test=ct.CDLL("/home/paula/libs/libcttest.so")
如果我现在尝试访问该功能(通过键入 'test.' 然后按 Tab 键)什么也不会发生。
如果我这样做:
我做错了什么?
哦,以防万一:
OS:xubuntu 14.10
Python:2.7.8
ipython:2.3.0
g++:4.9.1
你有两个问题:
- 首先,正如已经指出的那样,选项卡自动完成在第一次使用函数之前不会对 ctypes 起作用。 (让它在大多数平台上运行并非不可能,但我怀疑它会增加加载库的开销)。
- 您已经编写了 C 并试图像 C 那样调用它,但是您使用的是 C++ 编译器,所以您遇到了名称重整问题。
第一个问题的解决方案很简单 - 使用全名并且不要依赖自动完成。第二个至少有3个解决方案,我把它们从最好到最坏写在这里:
- 使用 C 编译器而不是 C++ 编译器。 (
gcc
而不是 g++
)。
Use extern "C"
强制 C++ 编译器不破坏函数名:
extern "C" void cttest(void);
extern "C"
{
void cttest()
{
printf("This is the shared module\n");
return;
}
}
在 Python 中使用损坏的 C++ 名称,在本例中为 _Z6cttestv
为了证明这是可行的,我在 Ubuntu 14.04:
上试用了它
gcc -shared -fPIC -o libcttest.so test.c
并在 ipython 中使用它:
ipython
Python 2.7.6 (default, Mar 22 2014, 22:59:38)
Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import ctypes as ct
In [2]: test=ct.CDLL('./libcttest.so')
In [3]: test.cttest()
This is the shared module
Out[3]: 26
我正在尝试编写一个 c 例程来加速 python 脚本。
为了路由证明我的方法我先写了一个简短的测试c函数并将它编译成一个库:测试函数的代码是:
void cttest(void);
#include <stdio.h>
void cttest()
{
printf("This is the shared module|n");
return;
}
我将这段代码保存到一个文件中 'ct_test.cc'。
然后我将这段代码编译如下:
g++ -shared -fPIC -o /home/paula/libs/libcttest.so ct_test.cc
没有给出错误或警告。
然后我加载了 ipython 并输入了以下内容:
import ctypes as ct
test=ct.CDLL("/home/paula/libs/libcttest.so")
如果我现在尝试访问该功能(通过键入 'test.' 然后按 Tab 键)什么也不会发生。
如果我这样做:
我做错了什么?
哦,以防万一:
OS:xubuntu 14.10 Python:2.7.8 ipython:2.3.0 g++:4.9.1
你有两个问题:
- 首先,正如已经指出的那样,选项卡自动完成在第一次使用函数之前不会对 ctypes 起作用。 (让它在大多数平台上运行并非不可能,但我怀疑它会增加加载库的开销)。
- 您已经编写了 C 并试图像 C 那样调用它,但是您使用的是 C++ 编译器,所以您遇到了名称重整问题。
第一个问题的解决方案很简单 - 使用全名并且不要依赖自动完成。第二个至少有3个解决方案,我把它们从最好到最坏写在这里:
- 使用 C 编译器而不是 C++ 编译器。 (
gcc
而不是g++
)。 Use
extern "C"
强制 C++ 编译器不破坏函数名:extern "C" void cttest(void); extern "C" { void cttest() { printf("This is the shared module\n"); return; } }
在 Python 中使用损坏的 C++ 名称,在本例中为
_Z6cttestv
为了证明这是可行的,我在 Ubuntu 14.04:
上试用了它gcc -shared -fPIC -o libcttest.so test.c
并在 ipython 中使用它:
ipython
Python 2.7.6 (default, Mar 22 2014, 22:59:38)
Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import ctypes as ct
In [2]: test=ct.CDLL('./libcttest.so')
In [3]: test.cttest()
This is the shared module
Out[3]: 26