技术开发 频道

浅谈Python程序和C程序的整合

  Python 访问 C 语言 dll

  通过 ctypes 模块,Python 程序可以访问 C 语言编译的 dll,本节通过一个简单的例子,Python 程序 helloworld.py 中调用 some.dll 中的 helloworld 函数,来介绍 Python 程序如何调用 windows 平台上的 dll。

  导入动态链接库

  清单 5. ctypes 导入 dll

from ctypes import windll # 首先导入 ctypes 模块的 windll 子模块
somelibc = windll.LoadLibrary(some.dll) # 使用 windll 模块的 LoadLibrary 导入动态链接库

  访问动态链接库中的函数

  清单 6. ctypes 使用 dll 中的函数

somelibc. helloworld() # 这样就可以得到 some.dll 的 helloworld 的返回值。

  整个 helloworld.py 是这样的:

  清单 7. Python hellpworld 代码

from ctypes import windll

def callc():
# load the some.dll
somelibc = windll.LoadLibrary(some.dll)
print somelibc. helloworld()
if __name__==__main__”:
callc()

  在命令行运行 helloworld.py,在 console 上可以看到 some.dll 中 helloworld 的输出。

  清单 8. Python hellpworld Windows command console 运行输出

C:\>python C:\python\test\helloworld.py
Hello World! Just a simple test.

  Python 调用 C 语言 so

  通过 ctypes 模块,Python 程序也可以访问 C 语言编译的 so 文件。与 Python 调用 C 的 dll 的方法基本相同,本节通过一个简单的例子,Python 程序 helloworld.py 中调用 some.so 中的 helloworld 函数,来介绍 Python 程序如何调用 linux 平台上的 so。

  导入动态链接库

  清单 9. ctypes 导入 so

from ctypes import cdll      
# 首先导入 ctypes 模块的 cdll 子模块,注意 linux 平台上使用 cdll 的,而不是 windll。
somelibc = cdll.LoadLibrary(“./some.so”)
  
# 使用 cdll 模块的 LoadLibrary 导入动态链接库

  访问动态链接库中的函数

  清单 10. ctypes 使用 so 中的函数

somelibc. helloworld() # 使用方法与 windows 平台上是一样的。

  整个 helloworld.py 是这样的:

  清单 11. Python helloworld 代码

from ctypes import cdll

def callc():
# load the some.so
somelibc = cdll.LoadLibrary(some.so)
print somelibc. helloworld()
if __name__==__main__”:
callc()

  在命令行运行 helloworld.py,在 linux 标准输出上可以看到 some.so 中 helloworld 的输出。

  清单 12. Python hellpworld Linux shell 运行输出

[root@linux-790t] python ./helloworld.py
Hello World! Just a simple test.
0
相关文章