ctypes – 初学者

我有“包装”到一个Python类的ac库的任务。 这个文件在这个问题上是非常模糊的。 看来他们希望只有高级的python用户才能实现ctypes。 那么我是一个Python初学者,需要帮助。

一些一步一步的帮助将是美好的。

所以我有我的C库。 我该怎么办? 我把什么文件放在哪里? 我如何导入图书馆? 我读过,可能有一种方法来“自动换行”到Python?

(顺便说一下,我在python.net上做了ctypes教程,它不起作用。意思是我认为他们假设我应该能够填写其余的步骤。

事实上,这是我得到的代码错误:

File "importtest.py", line 1 >>> from ctypes import * SyntaxError: invalid syntax 

我真的可以使用一些一步一步的帮助! 谢谢〜

这是一个快速和肮脏的ctypes教程。

首先,编写你的C库。 这是一个简单的Hello World示例:

testlib.c

 #include <stdio.h> void myprint(void); void myprint() { printf("hello world\n"); } 

现在将其编译为共享库( 在此处findmac修复 ):

 $ gcc -shared -Wl,-soname,testlib -o testlib.so -fPIC testlib.c # or... for Mac OS X $ gcc -shared -Wl,-install_name,testlib.so -o testlib.so -fPIC testlib.c 

然后,使用ctypes编写一个包装器:

testlibwrapper.py

 import ctypes testlib = ctypes.CDLL('/full/path/to/testlib.so') testlib.myprint() 

现在执行它:

 $ python testlibwrapper.py 

你应该看到输出

 Hello world $ 

如果你已经有了一个库,你可以跳过本教程的非python部分。 确保ctypes可以通过将其放在/usr/lib或其他标准目录中来find该库。 如果你这样做,写封装的时候不需要指定完整的path。 如果您select不执行此操作,则必须在调用ctypes.CDLL()时提供库的完整path。

这不是一个更全面的教程的地方,但如果你要求在这个网站的具体问题的帮助,我敢肯定,社区会帮助你。

PS:我假设你在Linux上,因为你已经使用了ctypes.CDLL('libc.so.6') 。 如果你在另一个操作系统,事情可能会改变一点(或相当多)。

首先:您在python示例中看到的>>>代码是一种表明它是Python代码的方式。 它用于从输出中分离Python代码。 喜欢这个:

 >>> 4+5 9 

在这里,我们看到,以>>>开头的行是Python代码,而结果是9行。如果你启动一个Python解释器,这就是它的样子,这就是它的原因。

您绝对不要将>>>部分input到.py文件中。

这照顾你的语法错误。

其次,ctypes只是包装Python库的几种方法之一。 其他的方法是SWIG ,它将查看你的Python库并生成一个公开C API的Python C扩展模块。 另一种方法是使用Cython 。

他们都有好处和缺点。

SWIG只会将您的C API暴露给Python。 这意味着你没有得到任何对象或任何东西,你将不得不做一个单独的Python文件。 然而,通常有一个名为say“wowza”的模块和一个名为“_wowza”的SWIG模块,它是C API的封装。 这是一个很好的和简单的做事方式。

Cython生成一个C扩展文件。 它的好处是你写的所有Python代码都是C语言,所以你写的对象也是C语言,这可以提高性能。 但是你必须学习如何与C接口,所以学习如何使用它是一件额外的工作。

ctypes的好处是不需要编译C代码,所以使用它来包装别人编写的标准库是非常好的,而且已经存在于Windows和OS X的二进制版本中。

Chinmay Kanchi的答案非常好,但我想要一个函数的例子,它传递并从C ++代码返回一个variables。 我虽然在这里包括它,以防其他人有用。 一个函数的C ++代码,它接受一个整数并将一个加到返回值中,

 extern "C" int add_one(int i) { return i+1; } 

保存为文件test.cpp ,注意所需的外部“C”(这可以删除C代码)。 这是使用g ++编译的,参数类似于Chinmay Kanchi的答案,

 g++ -shared -o testlib.so -fPIC test.cpp 

Python代码使用load_library中的numpy.ctypeslib假定与Python脚本位于相同目录中的共享库的path,

 import numpy.ctypeslib as ctl import ctypes libname = 'testlib.so' libdir = './' lib=ctl.load_library(libname, libdir) py_add_one = lib.add_one py_add_one.argtypes = [ctypes.c_int] value = 5 results = py_add_one(value) print(results) 

如预期的那样打印6。

在O'Reilly的Python食谱中有一个关于C扩展的章节 ,它给出了一个ctypes的工作示例。 我发现比官方文档更容易理解。