C 扩展¶
日期 | 2006-12-08(最后修改),2006-04-28(创建) |
---|
骨架¶
extmodule.h
:
请注意,PY_ARRAY_UNIQUE_SYMBOL
必须为每个扩展模块设置一个唯一的值。但是,除非您要编译使用两个不同源文件的扩展模块,否则您实际上不需要设置它。
extmodule.c
:
如果您的扩展模块包含在单个源文件中,那么您可以完全删除 extmodule.h,并将 extmodule.c
的第一部分替换为
在 Windows 上调试 C 扩展¶
在 Windows 上调试 C 扩展可能很棘手。如果您在调试模式下编译扩展代码,则必须链接到 Python 库的调试版本,例如 Python24_d.lib
。在使用 Visual Studio 构建时,Python24.h
中的 pragma 会处理此问题。如果您强制编译器将调试代码链接到发布库,您可能会遇到以下错误(尤其是在编译 SWIG 包装代码时)
但是,现在如果您想导入此可调试的扩展模块,您还需要 Python 解释器的调试版本。现在您还需要使用您使用的每个其他扩展模块的调试版本。显然,这可能需要一些时间才能解决。
另一种方法是将您的库代码构建为调试 DLL。这样,您至少可以确保您的扩展模块正在将正确的数据传递到您正在包装的库代码。
顺便说一句,似乎 MinGW GCC 编译器不会生成 Visual Studio 调试器可以理解的调试符号。
Valgrind¶
要开发一个稳定的扩展模块,必须检查 C 代码执行的内存分配和内存访问。在 Linux 上,您可以使用 Valgrind。在 Windows 上,您可以尝试使用商业工具,例如 Rational PurifyPlus。
在使用 Valgrind 之前,请确保您的扩展模块使用 -g
开关编译到 GCC,以便在检测到错误时获得有用的堆栈跟踪。
然后将以下内容放入一个 shell 脚本中,例如 valgrind_py.sh
valgrind-python.supp
会抑制 Python 代码引起的一些警告。您可以在 Python SVN 仓库中找到 Python 2.4 的抑制文件 此处。还可以参考同一位置的 README.valgrind。默认情况下,一些抑制项被注释掉了。通过移除 # 注释标记来启用它们。
执行 chmod +x valgrind_py.sh
并运行它,例如 ./valgrind_py.sh test_extmodule.py
。
文档¶
- 扩展和嵌入 Python 解释器(先阅读此文档)
- Python/C API 参考手册(然后浏览此文档)
- NumPy 指南 的第 13 章描述了完整的 API
- 第 14 章介绍了扩展 !NumPy(确保您拥有 2006 年 3 月 15 日或之后的版本)
示例¶
- SciPy SVN 仓库中的 ndimage
- NumPy 数组(小型示例的集合)
邮件列表主题¶
章节作者:AlbertStrasheim、TravisOliphant、DavidLinke