如何将 Cython 生成的模块从 python 导入 C/C++ 主文件? (用 C/C++ 编程)[关闭]
Posted
技术标签:
【中文标题】如何将 Cython 生成的模块从 python 导入 C/C++ 主文件? (用 C/C++ 编程)[关闭]【英文标题】:How to import Cython-generated module from python to C/C++ main file? (programming in C/C++) [closed] 【发布时间】:2017-05-09 18:08:08 【问题描述】:所以我有一个用 python 编写的函数,我按照 Cython 文档“使用 distutils 构建 Cython 模块”中的步骤进行操作。但是,我不清楚如何使用在 python 中工作的模块(通过导入它)嵌入到 C/C++ 中?我只想编译一个使用 Cython 导入 python 生成模块的 C/C++ 代码(我想这是一个 2 步过程)
*为了澄清,我已经完成了所有步骤并从 .pyx 源文件创建了一个 python 模块。但我的问题是如何将该模块集成到现有的 C/C++ 文件中。
【问题讨论】:
【参考方案1】:只需将你想在 c/c++ 中调用的东西声明为cdef public
例如:
# cymod.pyx
from datetime import datetime
cdef public void print_time():
print(datetime.now().ctime())
将cymod.pyx
转换为cymod.c
时,也会生成cymod.h
。
然后创建一个库,例如:cymod.lib
(在 windows 上)。
在c代码中(main.c):
#include "Python.h"
#include "cymod.h"
int main(int argc, char **argv)
Py_Initialize();
PyInit_cymod(); // in cymod.h
print_time(); // call the function from cython
Py_Finalize();
return 0;
编译运行(main.exe)
注意: main.exe 高度绑定python环境,可能会遇到cannot find pythonxx.dll
、Fatal Python error: Py_Initialize: unable to load the file system codec
等错误。这个网站上有很多解决方案。
【讨论】:
如何制作.lib? @Steven G 我在命令行使用VS编译器,例如call vcvarsall amd64
cl /c /nologo cymod.c /Ipython-header-path
lib cymod.obj
【参考方案2】:
通过查看Cython tutorial,这就是 Cython 如何使用已编译的 C 模块扩展 Python。
-
单独的 Cython 模块是用 Python 编写的。 Cython 会将其转换为静态编译模块,就像用 C 编写一样。
使用 setup.py
文件将 Cython 模块编译为 *.so
共享库。这个共享库实际上是一个 Python 模块。
python setup.py build_ext --inplace
来自常规 Python 脚本 import
Cython 模块
import helloworld
Cython 通常用于使用 C扩展 Python。另一方面,如果您想在 C 程序中嵌入 Python 代码,这也是可能的。 看看official docs on embedding Python into C 是一个很好的先阅读的地方。
这里有一个 github project 解释如何做到这一点,a blog 解释如何做到这一点。
【讨论】:
我已经完成了上述所有步骤。我的问题是如何将该模块(在您的情况下为 helloworld)集成到当前现有的 C/C++ 文件中。我想使用那个功能。不过感谢 cmets! 好的。我添加了一些关于如何将 Python 嵌入到 C 中的链接。我认为 Cython 的常规用途是用 C 扩展 Python以上是关于如何将 Cython 生成的模块从 python 导入 C/C++ 主文件? (用 C/C++ 编程)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Cython 将扩展模块传递给 python 导致 to_py_call_code 错误