У меня есть проект на python, который я хочу вызвать из приложения c ++.Я хотел бы объединить все исходники Python в одну общую библиотеку и связать приложение c ++ с этой библиотекой.Прямо сейчас мой cython setup.py создает один *.so
для каждого источника Python, что очень неудобно.
Вот файл setup.py
:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
sourcefiles = ['project_interface.pyx', 'impl_file1.pyx']
setup(
ext_modules = cythonize(sourcefiles)
)
project_interface.pyx:
# distutils: language = c++
import impl_file1
cdef public void HelloWorld():
print "Calling Hello World"
impl_file1.helloworld_func()
impl_file1.pyx:
def helloworld_func():
print 'Hello World'
Я пытался изменить файл setup.py для объединения всего кода Python в одну библиотеку, например:
setup(
ext_modules = cythonize([Extension("my_project", sourcefiles, language='c++')])
)
К сожалению,при выполнении void HelloWorld()
приложение не может больше сохранять файл impl_file1.Я получаю:
Calling Hello World
NameError: name 'impl_file1' is not defined
Exception NameError: "name 'impl_file1' is not defined" in 'project_interface.HelloWorld' ignored
Программа на C ++, управляющая этим:
#include <Python.h>
#include "project_interface.h"
int main(int argc, const char** argv){
Py_Initialize();
initproject_interface();
HelloWorld();
Py_Finalize();
return 0;
}
Это приложение работает правильно при компиляции с несколькими *.so
файлами.
Компиляция оченьв обоих случаях это просто:
python setup.py build_ext --inplace
mv my_project.so libmy_project.so
g++ main.cpp -o main `python2-config --cflags --ldflags` -L. -lmy_project
Есть ли способ заставить работать решение с единой общей библиотекой?