Ошибка при переносе helloworld из c ++ в python с помощью cython

У меня есть следующие файлы:

helloworld.cpp который содержит

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

void Helloworld(){
std::cout << "Hello world!" << "\n";
}

helloworld.pyx который содержит:

cdef extern from "helloworld.cpp":
cpdef void Helloworld()

а также setup.py который содержит:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

ext = Extension('helloworld', sources=["helloworld.pyx"], language="c++")

setup(name="helloworld", ext_modules = cythonize([ext]))

Когда я запускаю следующую команду в Ipython, она собирается правильно

In [1]: run setup.py build_ext --inplace --verbose
running build_ext
building 'helloworld' extension
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/ash/anaconda2/envs/python3/include/python3.5m -c helloworld.cpp -o build/temp.linux-x86_64-3.5/helloworld.o
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
g++ -pthread -shared -L/home/ash/anaconda2/envs/python3/lib -Wl,-rpath=/home/ash/anaconda2/envs/python3/lib,--no-as-needed build/temp.linux-x86_64-3.5/helloworld.o -L/home/ash/anaconda2/envs/python3/lib -lpython3.5m -o /home/ash/CallingC++fromPython/Cython/HelloWorld/helloworld.cpython-35m-x86_64-linux-gnu.so

но когда я пытаюсь импортировать его, я получаю следующую ошибку:

In [2]: import helloworld
------------------------------------------------------------------------
ImportError                            Traceback (most recent call last)
<ipython-input-12-9f213747d34d> in <module>()
----> 1 import helloworld

ImportError: dynamic module does not define module export function (PyInit_helloworld)

Я также попробовал следующее:

helloworld.pyx содержащий:

cdef extern from "helloworld.cpp":
void Helloworld()

def C_Helloworld():
return Helloworld()

В этом случае, когда я пытаюсь построить его, я получаю:

run setup.py build_ext --inplace --verbose
running build_ext
building 'helloworld' extension
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/ash/anaconda2/envs/python3/include/python3.5m -c helloworld.cpp -o build/temp.linux-x86_64-3.5/helloworld.o
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
In file included from helloworld.cpp:458:0,
from helloworld.cpp:458,
from helloworld.cpp:458,
from helloworld.cpp:458,
...
from helloworld.cpp:458,
from helloworld.cpp:458,
from helloworld.cpp:458:
helloworld.cpp:16:20: error: #include nested too deeply
helloworld.cpp:23:20: error: #include nested too deeply
helloworld.cpp:163:27: error: #include nested too deeply
In file included from helloworld.cpp:458:0,
from helloworld.cpp:458,
from helloworld.cpp:458,
...

что подразумевало, что это вызывается рекурсивно.

0

Решение

Я думаю, это потому, что ваш модуль пуст и не определяет какую-либо функцию.

Cython не создает оболочку. Вы должны сказать ему, как использовать ваши функции C ++.

Кроме того, содержимое вашего файла .pyx обычно находится в файле .pxd. Файл «.pyx» содержит функции, которые будут вызываться из python. Пример :

def hello_world():
Helloworld()
2

Другие решения

Проблема была двоякой. Одна из них заключалась в том, что, как заявил Мэнви, у меня не было функции-обертки для вызова функции C ++. Другая проблема заключалась в том, что мой файл C ++ имел то же имя, что и файл .pyx, поэтому при компиляции он рекурсивно перезаписывал файл C ++.

1