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)
完整筹码:
我在使用Python 2.7的Ubuntu 12.04上使用Matlab 2012a x64。任何想法为什么Python从MATLAB调用都无法导入非标准的Python库(这里是Numpy,但我和Scipy有同样的问题)?请注意,我的Windows计算机上的一切正常。
答案 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使用其(过时的)库。