python - 嵌入式Python,导入数学错误

标签 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 和头文件:

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

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

最佳答案

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

所以 '--disable-shared' 是问题所在,我将其切换为 '--enable-shared'。

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

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

关于python - 嵌入式Python,导入数学错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48745053/

相关文章:

python - TensorFlow 2.0 : Eager execution of training either returns bad results or doesn't learn at all

python - Pygame从外部字体文件加载字体

c - 字符串输出不符合预期

c++ - FreeTDS 的替代品?

c - int 变量在语句结果中声明为 double 后如何变化?

python - 在 Mac 上编写 Python 脚本的最佳方式(IDE?)

xcode - 从命令行创建新的 xcode 项目

iphone - 寻找优秀的教程来帮助 ASP.NET 人员学习 iPhone 开发

python - 使用 pandas 将日期列转换为标准格式

python - 我怎样才能自动登录 sahibinden.com