【问题标题】:why does python import causes an error with PyImport_ImportModule but not with python interpreter为什么 python 导入会导致 PyImport_ImportModule 出错,但不会导致 python 解释器出错
【发布时间】:2021-12-23 18:08:17
【问题描述】:

我有一个 Python 模块 mymodule,其中包含一个 import psutil 语句。我可以使用 python 解释器运行它而不会出现任何错误。
但是,我无法加载它 PyImport_ImportModule("mymodule")(来自python C API),由于undefined symbol 中的import psutil
我不明白是什么原因造成的,由于 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'

【问题讨论】:

  • @yoonghm 谢谢,但这与import __future__sys.path 无关
  • 对 PySys_SetPath() 的函数调用会完全覆盖 Python 模块路径。从标准文档来看,这是下面 PyImport_ImportModuleEx() 的简化接口,将 globals 和 locals 参数设置为 NULL 并将 level 设置为 0。也许您会显示更多代码

标签: python c psutil c-api


【解决方案1】:

好的,所以这里的问题是 dlopen 链接库的方式。
就我而言,从
dlopen(so_lib_name, RTLD_NOW)
更新 dlopen 到
dlopen(so_lib_name, RTLD_NOW|RTLD_GLOBAL)
成功了!

【讨论】:

  • 我刚刚遇到了同样的问题,您的回答为我解决了。谢谢。
猜你喜欢
  • 2020-04-09
  • 2023-04-06
  • 2019-04-11
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 2019-10-15
  • 2020-07-28
  • 2018-10-11
相关资源
最近更新 更多