如何将 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.dllFatal Python error: Py_Initialize: unable to load the file system codec等错误。这个网站上有很多解决方案。

【讨论】:

如何制作.lib? @Steven G 我在命令行使用VS编译器,例如call vcvarsall amd64cl /c /nologo cymod.c /Ipython-header-pathlib 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 和 C++ 组织项目

我应该如何构建包含 Cython 代码的 Python 包

python怎么使用cython

Cython 将扩展模块传递给 python 导致 to_py_call_code 错误

使用 Pyinstaller 或 Cython 从 Python 模块创建可执行文件

如何在 cython 模块中使用外部包装类?