使用system()从MATLAB调用Python:导致导入非标准Python库

时间:2014-05-30 04:10:04

标签: python matlab

test1.py包含:

import sys
print 'ok'

test2.py包含:

import sys
import numpy as np
print 'ok'

python test1.pypython 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)

完整筹码:

enter image description here

我在使用Python 2.7的Ubuntu 12.04上使用Matlab 2012a x64。任何想法为什么Python从MATLAB调用都无法导入非标准的Python库(这里是Numpy,但我和Scipy有同样的问题)?请注意,我的Windows计算机上的一切正常。

2 个答案:

答案 0 :(得分:2)

同样的问题是在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`

第三:sym link系统库:

 `sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3`

答案 1 :(得分:1)

如果您没有编辑MATLAB目录的权限,例如在MATLAB位于共享驱动器上的情况下,或者您只是想暂时更改MATLAB应调用的库,您可以使用{ {3}},允许您在任何其他库之前加载文件(通常是库)。

对于这个问题,问题在于,由于Marcin指出NumPy需要一个由MATLAB提供的更新版本的libgfortran.so.3,所以我们需要预加载libgfortran.so.3的系统版本(这应该是最新的,然后使用Numpy)在shell中使用以下命令:

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,并为它提供与从shell调用Python相同的环境。手动预加载Python代码所需的库是非常痛苦的,我仍然不明白为什么MATLAB默认强制Python使用其(过时的)库。