嵌入Python,导入数学错误

时间:2018-02-12 11:10:10

标签: python c xcode macos embed

首先,我使用的是Mac OSX 10.12.6。

我想在我的C应用程序中嵌入一个python环境。 我在https://github.com/python/cpython处获取github python项目并设法用它的配置文件和命令行编译它:

env LINKFORSHARED="-Wl,-stack_size,1000000  -framework CoreFoundation"
LDFLAGS="-Wl,-syslibroot,$SDK -arch i386" 
CFLAGS="-Os -isysroot $SDK -arch  i386"
./configure MACOSX_DEPLOYMENT_TARGET=10.6 --disable-shared --prefix=$PYTHON_PATH --exec-prefix=$PYTHON_PATH -build=i386-darwin
make
make altinstall 

($ SDK指向Xcode.app中的MacOSX.sdk)

它给了我一个32位的libPython.a然后我重做它为64位并与

合并
lipo -create libPython32.A libPython64.a libPython32-64.a

在我的XCode项目中,在.xconfig文件中,我使用以下命令导入lib和headers文件:

OTHER_LDFLAGS = $(inherited) -lpython32-64;
USER_HEADER_SEARCH_PATHS  = $(inherited) $(LIBS)/cpython35/include
LIBRARY_SEARCH_PATHS  = $(inherited) $(LIBS)/cpython35/lib;

一切都被找到,我的项目编译,没有问题。 然后在我的python.c文件中(我减少了本文的路径,这就是'...'的原因):

wchar_t *stdProgramName = L".../LIBs/cpython35/bin/python3.5";
Py_SetProgramName(stdProgramName);

wchar_t *stdPythonHome = L".../LIBs/cpython35";
Py_SetPythonHome(stdPythonHome);

wchar_t *stdlib = L".../LIBs/cpython35/lib/python3.5.zip:.../LIBs/cpython35/lib/python3.5:.../LIBs/cpython35/lib/python3.5/plat-darwin:.../LIBs/cpython35/lib/python3.5/lib-dynload:.../LIBs/cpython35/lib/python3.5/site-packages";
Py_SetPath(stdlib);

Py_Initialize();

// Run something
PyRun_SimpleString("import sys; print(sys.path)");
//To this line it's work fine, all path are correcte but then 
PyRun_SimpleString("import math;");

Py_Finalize();

导入数学图书馆不起作用,它给了我:

Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: dlopen(.../LIBs/cpython35/lib/python3.5/lib-dynload/math.cpython-35m-darwin.so, 2): Symbol not found: _PyExc_MemoryError
Referenced from: .../LIBs/cpython35/lib/python3.5/lib-dynload/math.cpython-35m-darwin.so
Expected in: flat namespace
in .../LIBs/cpython35/lib/python3.5/lib-dynload/math.cpython-35m-darwin.so

我有点卡在这一点上寻找这个导入的解决方案!!!

1 个答案:

答案 0 :(得分:0)

最后,我不需要我的python lib在静态库中

所以'--disable-shared'是问题所在,我用'--enable-shared'切换它。

通过这个更改,我得到一个libpython32.dylib,并且该lib可以访问math.cpython-35m-darwin.so ...

我的过程没有那么大改变。在我的项目中,我删除了OTHER_LDFLAGS中的-lpython32-64,并将libpython.dylib包含在“Link Binary With Libraries”中。 它有效。