双剑合璧,如何用Python调用C代码

作为一种动态语言,Python的语法灵活,表达强大,因此备受大家青睐,成为目前最受欢迎的语言之一。但是与此同时,灵活的语言特性所带来的代价是性能的降低。因此,Python在一些计算密集型的场景中,与一些底层语言,如C、C++相比,往往显得力不从心。那么,Python有没有办法在保持优秀语法特性的同时,还能够在性能上得到提升呢?当然可以。既然C语言的效率高,那么我们把程序中对性能要求较高的部分用C语言来实现就是一种解决方案。

双剑合璧,如何用Python调用C代码

学习学习代码和构建的 web 页面在电脑键盘上的 Python 关键

在本文中,我们将用C语言实现一个Python模块,并在Python代码中对其进行调用。作为例子,这个模块中将包含两个简单的函数:

  • Hello World
  • 斐波那契函数

C文件

首先我们创建一个.c文件,并且加入

#include

其中包含了必要的用C语言实现的Python对象

双剑合璧,如何用Python调用C代码

setup.py

接下来,我们利用Python中提供方法将C代码作为扩展模块加入到Python模块中

双剑合璧,如何用Python调用C代码

构建模块并运行

执行:

python setup.py build

python setup.py install

我们会得到类似下面的输出:

$ python3.6 setup.py build

running build

running build_ext

building 'myModule' extension

/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c test.c -o build/temp.macosx-10.6-intel-3.6/test.o

/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.6/test.o -o build/lib.macosx-10.6-intel-3.6/myModule.cpython-36m-darwin.so

$ python3.6 setup.py install

running install

running build

running build_ext

running install_lib

copying build/lib.macosx-10.6-intel-3.6/myModule.cpython-36m-darwin.so -> /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages

running install_egg_info

Removing /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/myModule-1.0-py3.6.egg-info

Writing /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/myModule-1.0-py3.6.egg-info

$ python3.6

Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)

[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import myModule

>>> myModule.helloworld()

Hello World

>>>

在另外一个例子斐波那契函数中,我们将展示如何在C函数中传递参数和返回值:

双剑合璧,如何用Python调用C代码

经过构建后,就可以调用了:

双剑合璧,如何用Python调用C代码

这就是在Python中调用C代码最基本的用法,希望对大家有用。欢迎大家留言讨论。


分享到:


相關文章: