首页 > 解决方案 > 如何在 Matlab 上运行 python 脚本(带有 Anaconda 包)?

问题描述

我正在尝试在 Matlab 中运行一个使用多个 Anaconda 包(python 3.7)的 python 脚本(我想使用 fmincon,使用已经存在的 python 脚本来评估目标函数和约束。),但我应付不来。操作系统是 Windows 7。

我已经在互联网上阅读了一些主题,并找到了几种可能的方法来解决这个问题,但似乎都没有奏效!

如果我直接在windows cmd中写

conda activate base
cd <path to  the folder of myscript>
python <myscript>.py 

所有的工作。但是,如果我将这些行写入要由 matlab 调用的 .bat 文件 (system('.bat')),则会出现以下错误:

<path to the folder of myscript> >python <myscript>.py   
Traceback (most recent call last): 
  File "myscript.py", line 30, in <module> 
    from polars import readPolars  # a module of mine
  File "<path to  the folder of myscript>\polars.py", line 25, in <module> 
    from numpy import triu_indices, zeros, triu, ones, empty 
  File "C:\Users\tesisti\Anaconda3\Lib\site-packages\numpy\__init__.py", line 140, in <module> 
    from . import _distributor_init 
  File "C:\Users\tesisti\Anaconda3\Lib\site-packages\numpy\_distributor_init.py", line 34, in <module> 
    from . import _mklinit 
ImportError: DLL load failed: The specified module could not be found. 

我也读过这可能是由于 anaconda 和 matlab 没有相同的 PATH 环境变量,所以我应该手动添加。但是,我不清楚该怎么做。

有人可以帮助我吗?还提出新策略?

谢谢你。

马可

标签: python-3.xwindowsmatlabanacondawindows-7-x64

解决方案


我遇到过同样的问题。您基本上需要将 conda 路径添加到 Matlab PATH 环境变量中。这是 Matlab 中的一个解决方法,您应该将“pyExec”替换为您自己的 Anaconda 路径:

pyExec = 'C:\Users\chrli\anaconda3\';
pyRoot = fileparts(pyExec);
p = getenv('PATH');
p = strsplit(p, ';');
addToPath = {
   pyRoot
   fullfile(pyRoot, 'Library', 'mingw-w64', 'bin')
   fullfile(pyRoot, 'Library', 'usr', 'bin')
   fullfile(pyRoot, 'Library', 'bin')
   fullfile(pyRoot, 'Scripts')
   fullfile(pyRoot, 'bin')
};
p = [addToPath(:); p(:)];
p = unique(p, 'stable');
p = strjoin(p, ';');
setenv('PATH', p);

然后你可以从 Matlab 调用你的 Python 脚本:

!conda activate base
!python myscript.py

您可以通过比较在调用“conda activate base”(在 cmd 中)之前和之后在 cmd 终端中键入“echo %PATH%”的输出来仔细检查需要添加到 Matlab PATH 的路径。

希望能帮助到你。我根据这个讨论调整我的解决方案:https ://www.mathworks.com/matlabcentral/answers/443558-matlab-crashes-when-using-conda-environment-other-than-base

最好的,

卡洛斯。


推荐阅读