在MATLAB中调用Python的system()时导入非标准Python库的问题
test1.py 文件的内容是:
import sys
print 'ok'
test2.py 文件的内容是:
import sys
import numpy as np
print 'ok'
在命令行中运行 python test1.py
和 python test2.py
都没有问题。
但是在 MATLAB 中,运行 system('python test1.py')
是可以的,而 system('python test2.py')
就不行,出现了以下错误信息:
>> system('python test2.py')
Traceback (most recent call last):
File "test.py", line 3, in <module>
import numpy as np
File "/usr/lib/python2.7/dist-packages/numpy/__init__.py", line 137, in <module>
import add_newdocs
File "/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 9, in <module>
from numpy.lib import add_newdoc
File "/usr/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 13, in <module>
from polynomial import *
File "/usr/lib/python2.7/dist-packages/numpy/lib/polynomial.py", line 17, in <module>
from numpy.linalg import eigvals, lstsq
File "/usr/lib/python2.7/dist-packages/numpy/linalg/__init__.py", line 48, in <module>
from linalg import *
File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 23, in <module>
from numpy.linalg import lapack_lite
ImportError: /afs/csail.mit.edu/system/common/matlab/2012a/sys/os/glnxa64/libgfortran.so.3: version `GFORTRAN_1.4' not found (required by /usr/lib/liblapack.so.3gf)
完整的错误信息:
我在 Ubuntu 12.04 上使用的是 64 位的 Matlab 2012a 和 Python 2.7。有人知道为什么从 MATLAB 调用 Python 时,无法导入一些非标准的 Python 库(这里是 Numpy,但我在使用 Scipy 时也遇到过同样的问题)吗?需要注意的是,在我的 Windows 电脑上,一切都运行得很好。
2 个回答
如果你没有权限编辑你的MATLAB目录,比如我这种情况,MATLAB在一个共享驱动器上,或者你只是想暂时改变MATLAB调用的库,你可以使用一种叫做LD_PRELOAD技巧的方法。这种方法可以让你在其他库之前加载一个文件(通常是一个库)。
在这个问题中,正如Marcin指出的,NumPy需要一个更新版本的libgfortran.so.3
,而MATLAB提供的版本比较旧。所以我们需要用下面的命令在终端中预加载系统版本的libgfortran.so.3
(这个版本应该是最新的,能和NumPy一起正常工作):
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libgfortran.so.3 matlab
如果你想确保NumPy和SciPy在MATLAB中都能正常工作,可以创建一个名为good_luck.py
的文件,内容是:
import numpy
numpy.test('full')
import scipy
scipy.test('full')
然后在MATLAB中用系统命令调用它:system('python good_luck.py')
。
如果你需要预加载多个文件,这种情况很常见,通常可以用:
来连接它们,比如:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libgfortran.so.3:/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16: matlab
我还是希望能有一个解决方案,能强制MATLAB调用Python,并给它一个和从终端调用Python时一样的环境。手动预加载Python代码需要的库真的很麻烦,我还是不明白为什么MATLAB默认要强制Python使用它那些(过时的)库。
在Ubuntu 14.04 x64上使用Matlab R2013a时也遇到了同样的问题。
问题是Matlab自带了一些自己的库,比如说libgfortran.so.3
,而不是使用系统自带的库。根据我在网上查到的信息,这些库通常是过时的,而numpy需要更新版本的库。所以就出现了问题。
在Ubuntu上,只需要更换这些库就可以解决。不知道在Windows上怎么做(我猜可能会有点类似),但在Ubuntu上的步骤如下:
第一步: 进入:
`cd /usr/local/MATLAB/R2013a/sys/os/glnxa64`
第二步: 备份Matlab的libgfortran.so.3
:
`sudo mv libgfortran.so.3 libgfortran.so.3.bck`
第三步: 创建系统库的符号链接:
`sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3`