Python:从命令行启动的脚本中的模块的ImportError

问题描述

一个由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语句中的

。现在该模块已正确导入