Matlab不能调用导入statsmodels的Python代码

时间:2015-02-11 13:12:42

标签: python matlab

这个问题涉及Matlab 2014b,Python 3.4和Mac OS 10.10。

我有以下Python文件tmp.py

from statsmodels.tsa.arima_process import ArmaProcess
import numpy as np
def generate_AR_time_series():
    arparams = np.array([-0.8])
    maparams = np.array([])
    ar = np.r_[1, -arparams]
    ma = np.r_[1, maparams]
    arma_process = ArmaProcess(ar, ma)
    return arma_process.generate_sample(100)

我想从Matlab调用generate_AR_time_series,所以我使用了:

py.tmp.generate_AR_time_series()

给出了一个模糊的错误消息

Undefined variable "py" or class "py.tmp.generate_AR_time_series".

为了进一步研究这个问题,我尝试了

tmp = py.eval('__import__(''tmp'')', struct);
which gave me a detailed but still obscured error message:

Python Error:
dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/special/_ufuncs.so, 2): Symbol
not found: __gfortran_stop_numeric_f08
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/special/_ufuncs.so
  Expected in: /Applications/MATLAB_R2014b.app/sys/os/maci64/libgfortran.3.dylib
 in /opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/special/_ufuncs.so

我可以在Python中调用该函数,所以我猜问题是Matlab。从详细消息来看,似乎问题在于Matlab安装路径中的预期,但当然Matlab安装路径不包含那些东西,因为它们是Python的第三方库。

如何解决这个问题?

修改1 libgfortran.3.dylib可以在很多地方找到:

/Applications/MATLAB_R2014a.app/sys/os/maci64/libgfortran.3.dylib
/Applications/MATLAB_R2014b.app/sys/os/maci64/libgfortran.3.dylib
/opt/local/lib/gcc48/libgfortran.3.dylib
/opt/local/lib/gcc49/libgfortran.3.dylib
/opt/local/lib/libgcc/libgfortran.3.dylib
/Users/wdg/Documents/MATLAB/mcode/nativelibs/macosx/bin/libgfortran.3.dylib

2 个答案:

答案 0 :(得分:1)

尝试:

setenv('DYLD_LIBRARY_PATH', '/usr/local/bin/');

答案 1 :(得分:0)

对我来说,在MATLAB中使用setenv方法不起作用。此外,MATLAB在启动期间修改DYLD_LIBRARY_PATH变量以包含必要的库。

首先,您必须确保链接了gfortran scipy的哪个版本:在Terminal.app中,输入otool -L /opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/special/_ufuncs.so并在其中查找“libgfortran”输出

我可以将$(MATLABROOT)/bin/.matlab7rc.sh复制到我的主目录,并将LDPATH_PREFIX=''部分(我的情况下为第195行)中的行mac更改为LDPATH_PREFIX='/opt/local/lib/gcc49',或者您在上面找到libgfortran的任何路径。 这可确保在MATLAB版本之前找到/opt/local/lib/gcc49/libgfortran.3.dylib,但保留其他路径。