跳到主要内容

Python 调用 C语言模块

python不擅长"大量运算"任务,python程序优势在于:编写简单,适合"IO密集型作业"(比如打开文件,下载图片,运行脚本)。python作为知名的"胶水语言",快速实现"计算密集型作业"的方法就是"把 c 的代码拿过来直接用"。

pybind11

pybind11 是一个用于创建 Python 绑定的 C++ 库,它使得在 C++ 中编写 Python 模块变得非常简单。pybind11 是一个轻量级的头文件库,不需要额外的构建步骤或依赖项。它支持 Python 2.7 和 3.x,以及 PyPy。

pip install pybind11

使用 pybind11 编译生成的 .pyd 文件(在 Windows 上,对应的在 Linux 或 macOS 上是 .so 文件)实际上是一个 Python 模块。要在 Python 中使用这个模块,你需要执行以下步骤:

  1. 确保 .pyd 文件在 Python 的搜索路径中:Python 导入模块时会在一系列路径中搜索这个模块。你可以通过修改环境变量 PYTHONPATH 或者在 Python 代码中修改 sys.path 来确保 Python 能找到你的模块。另外一种简单的方式是将 .pyd 文件放在你的脚本所在的目录中。

  2. 导入模块:一旦 .pyd 文件位于 Python 的搜索路径中,你就可以像导入任何其他 Python 模块一样导入它。如果你的 .pyd 文件名为 example.pyd,你只需要在 Python 中使用 import example

  3. 使用模块中的功能:导入模块后,你就可以使用其提供的函数、类等。

下面是一个简单的示例:

假设你有一个名为 example.pyd 的模块,其中定义了一个函数 add 和一个类 Pet

# 确保 example.pyd 在当前目录或者 PYTHONPATH 中
import example

# 使用 example 模块中的函数
result = example.add(1, 2)
print(result)

# 创建 example 模块中定义的类的实例
my_pet = example.Pet("Fido")
print(my_pet.name)

如果你遇到导入错误或者其他问题,请检查以下几点:

  • 确保 .pyd 文件没有被损坏,并且是为你的 Python 版本和架构正确编译的。
  • 确保所有必要的依赖项都已安装,包括与 .pyd 文件相关的任何外部库。
  • 如果你在导入时收到特定的错误消息,例如找不到模块或者符号解析错误,这可能指示了路径问题或者依赖项问题,需要根据错误消息来解决。

通过这些步骤,你应该能够成功地在 Python 中使用通过 pybind11 生成的模块。