我正在努力了解Cython如何将.pyx编译为.cpp文件,以及如何找到我的.pyx文件的C++翻译。
我的文件是一个简单的helloworld.pyx文件
print("Hello world")
我使用官方Cython指南中的setup.py,如下所示:
from Cython.Build import cythonize
extensions = [
Extension(
"helloworld",
sources=["helloworld.pyx"],
language="c++"
),
]
setup(ext_modules = cythonize(extensions))
运行python3 setup.py build_ext --inplace
后
这非常好地生成了.cpp和.so文件。然而,我在.cpp文件中得到了大约3000行代码,其中大部分都是定义之类的。当我看到文件中包含以下内容时,我非常高兴:
/* Implementation of 'helloworld' */
static const char __pyx_k_end[] = "end";
static const char __pyx_k_file[] = "file";
static const char __pyx_k_main[] = "__main__";
static const char __pyx_k_name[] = "__name__";
static const char __pyx_k_test[] = "__test__";
static const char __pyx_k_print[] = "print";
static const char __pyx_k_Hello_world[] = "Hello world";
static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
static PyObject *__pyx_kp_s_Hello_world;
static PyObject *__pyx_n_s_cline_in_traceback;
static PyObject *__pyx_n_s_end;
static PyObject *__pyx_n_s_file;
static PyObject *__pyx_n_s_main;
static PyObject *__pyx_n_s_name;
static PyObject *__pyx_n_s_print;
static PyObject *__pyx_n_s_test;
/* Late includes */
但是,这不是有效的.cpp。是否可以在编译过程中生成有效的C++代码并以某种方式输出这段代码?遗憾的是,我无法复制整个文件,因为它太长了。
编辑:
我希望实现的一个非常具体的例子就是这些人正在做的事情:从Cython代码生成SIMD指令
他们编写Cython,像我一样使用命令,然后获得一些干净的可编译的C代码。
首先要明确的是:Cython不会创建可独立编译的简短自包含代码。它被设计为作为Cython模块的一部分进行编译,其中包含3000多行实用程序代码。对于经常与Python交互的代码(例如您的print语句(来说尤其如此。
因此,如果你希望能够复制C++代码的一个短函数并独立运行它,答案是";你不能"。
第二:
但是,这是无效的.cpp。〔…〕
这是错误的。它是完全有效的C++。它不是独立的(它依赖于Python.h(,但它是一组全局常量的声明。
Third(实际上是直接回答您的问题(-默认情况下,Cython将您输入的Cython代码嵌入到文件的注释中。这使得只需搜索一行就可以很容易地找到与现有代码匹配的C/C++代码(记住,一行代码可能会在多个地方生成代码,尤其是函数定义(。
文件中的关键行是
/* "hw.py":1
* print("Hello world") # <<<<<<<<<<<<<<
*/
if (__Pyx_PrintOne(0, __pyx_kp_s_Hello_world) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
注意,它取决于Cython实用程序代码函数__Pyx_PrintOne
和全局字符串常量__pyx_kp_s_Hello_world
。即不是独立的。
另一个有用的工具是cython -a
命令行选项,它创建一个带注释的HTML文件,显示您的输入代码如何与C/C++代码链接。