Cython - 导入Cython模块并将它们合并为单个共享对象

2024-10-01 11:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python将Python函数包到C++ API。我有两个模块sam1.pyx和sam2.pyx

## - sam1.pyx
import sam2
cdef public double calc(double x, double y):
  return sam2.calc_sub(x,y)

sam2.py文件的内容如下

^{pr2}$

使用这样的结构,将生成被包装的sam1.h以及相应的{}

在Cpp应用程序中使用时

#include<iostream>
#include<Python.h>
#include"sam1.h"

using namespace std;

int main(){

  Py_Initialize();

  #if PY_MAJOR_VERSION < 3
   initsam1();
  #else
   PyInit_sam1();
  #endif  

  cout << "Starting Program!!"<<endl;

  cout << calc(3, 5);

  Py_Finalize();

  return 0;
}

未导入sam2.py(普通python),错误是

Exception NameError: "name 'sam2' is not defined" in 'sam1.calc' ignored

你能告诉我缺了什么吗?在


Tags: 模块函数pyimportapireturnincludecalc
1条回答
网友
1楼 · 发布于 2024-10-01 11:23:44

问题1是您的模块初始化功能失败。在python3中,您需要针对NULL测试输出,然后打印错误(如果发生):

PyObject* m = PyInit_sam1();
if (m==NULL) {
    cout << "Module initialization failed!\n";
    if (PyErr_Occurred()) {
        PyErr_Print();
    }
}

我想你什么也不做。可能只是PyErr_Occurred)。这告诉你:

Traceback (most recent call last):

File "sam1.pyx", line 2, in init sam1 (sam1.cpp:1094)

import sam2

ModuleNotFoundError: No module named 'sam2'

这个回溯很有希望给你提供你需要的线索——它没有找到sam2。这是因为默认情况下,当前目录不在C api程序的路径上。您需要将其设置为这样-以下代码在Py_Initialize之后,但在模块初始化之前:

^{pr2}$

它得到sys.path并将.附加到它。之后一切都很好。在


注意-如果您从其他目录调用程序,则“.”表示错误的位置。如果是这种情况,那么您需要做一些更聪明的事情,并计算出目录的填充路径,可能是argv[0]。在

相关问题 更多 >