在 Matlab 中启动 python 脚本时模块导入错误

Module ImportError when launching python script in Matlab

我在 Matlab 中使用操作系统命令来启动 python 脚本。直到最近一切都运行良好,事实上我怀疑问题出在最近将 Matlab 升级到 R2017b 和 Fedora 到 FC27。

事实:如果我在 shell 中启动脚本 python 一切正常。但是如果我在 Matlab 中启动相同的脚本,很少会引发 ImportError 异常:

Traceback (most recent call last):

  File "/usr/lib64/python3.6/xml/etree/ElementTree.py", line 1448, in __init__

    from xml.parsers import expat

  File "/usr/lib64/python3.6/xml/parsers/expat.py", line 4, in <module>

    from pyexpat import *

ImportError: /usr/lib64/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so: undefined symbol: XML_SetHashSalt



During handling of the above exception, another exception occurred:



Traceback (most recent call last):

  File "/usr/lib64/python3.6/xml/etree/ElementTree.py", line 1451, in __init__

    import pyexpat as expat

ImportError: /usr/lib64/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so: undefined symbol: XML_SetHashSalt



During handling of the above exception, another exception occurred:



Traceback (most recent call last):

  File "/data_1/IRM/amigo/src/IRMAGE_python_scripts/IRMAGE_report.py", line 1409, in <module>

    outFormat = 'png')

  File "/data_1/IRM/amigo/src/IRMAGE_python_modules/IRMAGE_reporting.py", line 1576, in plotPatVsRef

    bookRef = xlrd.open_workbook(refFile)

  File "/usr/lib/python3.6/site-packages/xlrd/__init__.py", line 422, in open_workbook

    ragged_rows=ragged_rows,

  File "/usr/lib/python3.6/site-packages/xlrd/xlsx.py", line 784, in open_workbook_2007_xml

    ensure_elementtree_imported(verbosity, logfile)

  File "/usr/lib/python3.6/site-packages/xlrd/xlsx.py", line 48, in ensure_elementtree_imported

    ET.iterparse(_dummy_stream)

  File "/usr/lib64/python3.6/xml/etree/ElementTree.py", line 1217, in iterparse

    pullparser = XMLPullParser(events=events, _parser=parser)

  File "/usr/lib64/python3.6/xml/etree/ElementTree.py", line 1256, in __init__

    self._parser = _parser or XMLParser(target=TreeBuilder())

  File "/usr/lib64/python3.6/xml/etree/ElementTree.py", line 1454, in __init__

    "No module named expat; use SimpleXMLTreeBuilder instead"

ImportError: No module named expat; use SimpleXMLTreeBuilder instead

从昨天开始面对这个问题我有点迷茫,我承认我没有解决这个问题的新想法......非常欢迎有关这个问题的所有想法,信息和帮助

我只是想检查有关 /usr/lib64/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu. 的共享对象依赖关系,因此引发了 ImportError 异常! !!

在 shell:

% ldd /usr/lib64/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so
    linux-vdso.so.1 (0x00007ffd8f7c5000)
    libexpat.so.1 => /lib64/libexpat.so.1 (0x00007ff82fae8000)
    libpython3.6m.so.1.0 => /lib64/libpython3.6m.so.1.0 (0x00007ff82f588000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff82f369000)
    libc.so.6 => /lib64/libc.so.6 (0x00007ff82ef86000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007ff82ed82000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007ff82eb7f000)
    libm.so.6 => /lib64/libm.so.6 (0x00007ff82e82a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ff82ff2c000)

在 Matlab 中:

! ldd /usr/lib64/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so
        linux-vdso.so.1 (0x00007ffeec596000)
        libexpat.so.1 => /usr/local/MATLAB/R2017b/bin/glnxa64/libexpat.so.1 (0x00007fcd2931e000)
        libpython3.6m.so.1.0 => /lib64/libpython3.6m.so.1.0 (0x00007fcd28dbe000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcd28b9f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fcd287bc000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fcd285b8000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007fcd283b5000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fcd28060000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fcd29758000)

所以很明显,问题出在 Matlab 发行版 (libexpat.so.1.5.0) 中的 libexpat.so.1 共享对象,比系统 ( libexpat.so.1.6.7)!!!:

% ls -l /usr/local/MATLAB/R2017b/bin/glnxa64/libexpat.so*
lrwxrwxrwx. 1 root root     17 Feb 22 12:41 libexpat.so.1 -> libexpat.so.1.5.0
-r-xr-xr-x. 1 root root 182222 Jul 24  2017 libexpat.so.1.5.0
% ls -l /usr/lib64/libexpat.so*
lrwxrwxrwx. 1 root root     17 Nov  6 18:00 /usr/lib64/libexpat.so -> l    ibexpat.so.1.6.7
lrwxrwxrwx. 1 root root     17 Nov  6 18:00 /usr/lib64/libexpat.so.1 -> libexpat.so.1.6.7
-rwxr-xr-x. 1 root root 206000 Nov  6 18:00 /usr/lib64/libexpat.so.1.6.7

我通过将 Matlab distrib 的共享对象移动到排除目录来解决问题,以强制使用系统之一!!!

# cd /usr/local/MATLAB/R2017b/bin/glnxa64
# mkdir exclude
# mv libexpat.so* exclude/

现在一切正常!!!

P.S。在升级 Matlab 和 Fedora 后,我遇到了一些其他问题 运行 正确地使用 Matlab,我在这里没有详细说明。但是,如果有人对 Matlab 和 FC26 或 FC27 有其他问题,我可以根据要求提供我所做的所有更改(所有更改都与 Matlab 发行版中太旧的共享对象有关!!!)