问题描述
有一个由SWIG生成的自定义模块“ ETPython”(由 ETPython.py 和二进制文件 _ETPython.so 组成)和一个简单的脚本来调用该模块>
sample.py
import ETPython
...
如果脚本在IDE中运行,则没有任何问题(pycharm,内部python的IDLE,froglogic压榨等等)。但是,如果我想以交互模式或使用终端通过
在python shell中启动它python3 sample.py
有类似以下错误消息:
File "<path_to_file>/example.py",line 12,in <module>
import ETPython
File "<path_to_file>/ETPython.py",line 15,in <module>
import _ETPython
ImportError: dlopen(<path_to_file>/_ETPython.so,2): Symbol not found: _NSLog
Referenced from: <path_to_file>/_ETPython.so
Expected in: flat namespace
在搜索主题时,我发现问题与错误的路径有关。所以我添加了一些代码:
import os,sys
os.chdir("<path_to_dir>")
sys.path.append('<path_to_dir>')
os.system('export PYTHONPATH=<path_to_dir>:$PYTHONPATH')
此代码有助于以交互方式在python shell中导入模块,但在终端中启动仍然失败。
所以问题是如何使其发挥作用?
解决方法
我找到了解决方案。 SWIG模块编译不正确。 CMake的选项可以抑制未定义符号的错误
set(PLATFORM_LIBS "-undefined dynamic_lookup" )
该模块为何不包含NSLOG符号的原因。 重新编译了该模块,并添加了其他
"-framework Foundation"
swig_link_libraries语句中的。现在该模块已正确导入