【发布时间】:2018-10-04 11:54:44
【问题描述】:
我有一个要从 c++ 应用程序调用的 python 项目。我想将所有 python 源捆绑在一个共享库中,并将 c++ 应用程序链接到该库。现在我的 cython setup.py 为每个 python 源创建一个 *.so,这非常不方便。
这是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
有没有办法让单一共享库解决方案发挥作用?
【问题讨论】:
标签: python cython setup.py distutils