为什么 python import 会导致 PyImport_ImportModule 错误,但 python 解释器不会
why does python import causes an error with PyImport_ImportModule but not with python interpreter
我有一个 python 模块 mymodule
,其中包含一个 import psutil
语句。我可以 运行 它使用 python 解释器没有任何错误。
但是,我无法加载它
PyImport_ImportModule("mymodule")
(来自 python C API),由于 import psutil
中的 undefined symbol
。
我不明白是什么原因造成的,因为 C 代码是旨在加载各种 python 模块的共享对象的一部分,我将不胜感激任何帮助。
我怀疑这是一个比这个特定模块更大的问题,但这里有一些具体细节-
回溯
Traceback (most recent call last):
File "/path/to/mymodule.py", line 7, in <module>
import psutil
File "/usr/local/lib/python3.8/dist-packages/psutil/__init__.py", line 99, in <module>
from . import _pslinux as _psplatform
File "/usr/local/lib/python3.8/dist-packages/psutil/_pslinux.py", line 26, in <module>
from . import _psutil_linux as cext
ImportError: /usr/local/lib/python3.8/dist-packages/psutil/_psutil_linux.cpython-38-x86_64-linux-gnu.so: undefined symbol: PyExc_RuntimeError
ldd
linux-vdso.so.1 (0x00007ffe91b5e000)
libpython3.8.so.1.0 => /lib/x86_64-linux-gnu/libpython3.8.so.1.0 (0x00007f5a1b41a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5a1b3f7000)
libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f5a1b121000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5a1af3f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5a1af24000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a1ad30000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f5a1ad02000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f5a1ace6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5a1ace0000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f5a1acdb000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5a1ab8c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5a1b9a8000)
psutil
关于 python 解释器:
>>> import psutil
>>> psutil.__file__
'/usr/local/lib/python3.8/dist-packages/psutil/__init__.py'
好的,所以这里的问题是 dlopen link 库的方式。
对于我的情况,从
更新 dlopen
dlopen(so_lib_name, RTLD_NOW)
至
dlopen(so_lib_name, RTLD_NOW|RTLD_GLOBAL)
成功了!
我有一个 python 模块 mymodule
,其中包含一个 import psutil
语句。我可以 运行 它使用 python 解释器没有任何错误。
但是,我无法加载它
PyImport_ImportModule("mymodule")
(来自 python C API),由于 import psutil
中的 undefined symbol
。
我不明白是什么原因造成的,因为 C 代码是旨在加载各种 python 模块的共享对象的一部分,我将不胜感激任何帮助。
我怀疑这是一个比这个特定模块更大的问题,但这里有一些具体细节-
回溯
Traceback (most recent call last):
File "/path/to/mymodule.py", line 7, in <module>
import psutil
File "/usr/local/lib/python3.8/dist-packages/psutil/__init__.py", line 99, in <module>
from . import _pslinux as _psplatform
File "/usr/local/lib/python3.8/dist-packages/psutil/_pslinux.py", line 26, in <module>
from . import _psutil_linux as cext
ImportError: /usr/local/lib/python3.8/dist-packages/psutil/_psutil_linux.cpython-38-x86_64-linux-gnu.so: undefined symbol: PyExc_RuntimeError
ldd
linux-vdso.so.1 (0x00007ffe91b5e000)
libpython3.8.so.1.0 => /lib/x86_64-linux-gnu/libpython3.8.so.1.0 (0x00007f5a1b41a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5a1b3f7000)
libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f5a1b121000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5a1af3f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5a1af24000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a1ad30000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f5a1ad02000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f5a1ace6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5a1ace0000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f5a1acdb000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5a1ab8c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5a1b9a8000)
psutil
关于 python 解释器:
>>> import psutil
>>> psutil.__file__
'/usr/local/lib/python3.8/dist-packages/psutil/__init__.py'
好的,所以这里的问题是 dlopen link 库的方式。
对于我的情况,从
更新 dlopen
dlopen(so_lib_name, RTLD_NOW)
至
dlopen(so_lib_name, RTLD_NOW|RTLD_GLOBAL)
成功了!