首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决Matlab调用Anaconda env时numpy导入错误

如何解决Matlab调用Anaconda env时numpy导入错误
EN

Stack Overflow用户
提问于 2018-06-20 22:56:04
回答 3查看 1K关注 0票数 1

我想从Matlab (在Windows7机器上)执行Python脚本。所需的库安装在Anaconda虚拟环境中。当从命令行运行脚本时,它可以完美地运行。

从Matlab中调用脚本时,如下所示:[status, commandOut] = system('C:/Users/user/AppData/Local/Continuum/anaconda3/envs/tf/python.exe test.py');

或者使用shell命令,我得到了一个导入错误:

代码语言:javascript
运行
复制
commandOut =

    'Traceback (most recent call last):
       File "C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\lib\site-packages\numpy\core\__init__.py", line 16, in <module>
         from . import multiarray
     ImportError: DLL load failed: The specified path is invalid.

     During handling of the above exception, another exception occurred:

     Traceback (most recent call last):
       File "test.py", line 2, in <module>
         import numpy as np
       File "C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\lib\site-packages\numpy\__init__.py", line 142, in <module>
         from . import add_newdocs
       File "C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\lib\site-packages\numpy\add_newdocs.py", line 13, in <module>
         from numpy.lib import add_newdoc
       File "C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\lib\site-packages\numpy\lib\__init__.py", line 8, in <module>
         from .type_check import *
       File "C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\lib\site-packages\numpy\lib\type_check.py", line 11, in <module>
         import numpy.core.numeric as _nx
       File "C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\lib\site-packages\numpy\core\__init__.py", line 26, in <module>
         raise ImportError(msg)
     ImportError: 
     Importing the multiarray numpy extension module failed.  Most
     likely you are trying to import a failed build of numpy.
     If you're working with a numpy git repo, try `git clean -xdf` (removes all
     files not under version control).  Otherwise reinstall numpy.

     Original error was: DLL load failed: The specified path is invalid.

我已经将默认的Matlab Python版本更改为Anaconda env,但没有更改:

代码语言:javascript
运行
复制
   version: '3.5'
executable: 'C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\python.exe'
   library: 'C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf\python35.dll'
      home: 'C:\Users\user\AppData\Local\Continuum\anaconda3\envs\tf'
  isloaded: 1

只运行我的测试脚本而不导入numpy works。重新加载numpy (py.importlib.import_module('numpy');)不起作用,但抛出了和以前一样的错误。

有谁知道怎么解决这个问题吗?

EN

回答 3

Stack Overflow用户

发布于 2018-06-22 15:24:42

因此,在与Matlab支持进行通信后,我发现Matlab依赖于路径环境(使用虚拟环境时故意不设置的路径),因此当从Matlab中调用numpy时,无法找到必要的路径(即使调用包含到虚拟环境的路径)。

解决方案是从虚拟环境中调用Matlab (通过命令行),或者在path环境中手动添加缺少的路径。也许这些信息可以帮助其他人。

票数 1
EN

Stack Overflow用户

发布于 2019-05-16 22:51:46

First方法

您可以使用以下命令更改python解释器:

代码语言:javascript
运行
复制
pyversion("/home/nibalysc/Programs/anaconda3/bin/python");

并使用以下命令进行检查:

代码语言:javascript
运行
复制
pyversion();

您也可以在

初创公司下午

文件,每次你从这个文件夹启动MATLAB时,python解释器都会自动改变。

现在您可以尝试使用:

代码语言:javascript
运行
复制
py.importlib.import_module('numpy');

阅读有关如何在MATLAB中使用集成的python的文档:

Call user defined custom module

Call modified python module

替代方法

另一种方法是创建一个

matlab_shell.sh

文件包含以下内容,这基本上是安装anaconda时来自.bashrc的附加代码,并询问您安装程序是否应该修改.bashrc文件:

代码语言:javascript
运行
复制
#!/bin/bash
__conda_setup="$(CONDA_REPORT_ERRORS=false '$HOME/path/to/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "$HOME/path/to/anaconda3/etc/profile.d/conda.sh" ]; then
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="$HOME/path/to/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda init <<<
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('$HOME/path/to/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "$HOME/path/to/anaconda3/etc/profile.d/conda.sh" ]; then
        . "$HOME/path/to/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="$HOME/path/to/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
conda activate base
eval $2

然后,您需要在运行MATLAB之前或在MATLAB中设置MATLAB_SHELL环境变量。在我看来,最好的做法是在startup.m文件中也这样做:

代码语言:javascript
运行
复制
setenv("MATLAB_SHELL", "/path/to/matlab_shell.sh");

之后,您可以使用系统(...)函数来运行conda python,所有模块都是这样安装的……

字符串表示法:

代码语言:javascript
运行
复制
system("python -c ""python code goes here"");

字符表示法:

代码语言:javascript
运行
复制
system('python -c "python code goes here"');

希望这能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2020-04-13 05:45:01

首先,如果您像执行常规系统命令([status, commandOut] = system('...python.exe test.py'))一样执行Python脚本,那么pyversion (和pyenv,因为是R2019b)根本不起作用。只有在使用py.集成时才重要,如下面的代码所示(在大多数情况下,这是一种更好的方法)。

目前(我使用的是R2019b update 5)有许多陷阱,可能会导致类似您的问题。我建议从以下几点开始:

  1. 创建新的干净的conda环境:

代码语言:javascript
运行
复制
conda create -n test_py36 python=3.6 numpy

  1. 创建以下虚拟demo1.py

代码语言:javascript
运行
复制
def dummy_py_method(x):
    return x+1

  1. 创建以下run_py_code.m

代码语言:javascript
运行
复制
function  run_py_code()

% explicit module import sometimes show more detailed error messages
py.importlib.import_module('numpy');

% to reloads if there would be any changes:
pymodule = py.importlib.import_module('demo1');
py.importlib.reload(pymodule);

% passing data back and forth
x = rand([3 3]);
x_np = py.numpy.array(x);
y_np=pymodule.dummy_py_method(x_np);
y = double(y_np);
disp(y-x);

  1. 创建以下before_first_run.m

代码语言:javascript
运行
复制
setenv('PYTHONUNBUFFERED','1');

setenv('path',['C:\Users\username\Anaconda3\envs\test_py36\Library\bin;'...
               getenv('path')]);

pe=pyenv('Version','C:\users\username\Anaconda3\envs\test_py36\pythonw.exe',...
         'ExecutionMode','InProcess'...
         ); 

% add "demo1.py" to path
py_file_path = 'W:\tests\Matlab\python_demos\call_pycode\pycode';
if count(py.sys.path,py_file_path) == 0
    insert(py.sys.path,int32(0),py_file_path);
end

  1. 首先运行before_first_run.m,然后运行run_py_code.m

备注:

  • 正如在this answer中已经提到的,一个关键点是在启动python之前将包含必要的dll文件的文件夹添加到%PATH%中。这可以通过Matlab语言中的setenv实现。通常,应该添加Library\bin
  • 尝试干净的官方支持的CPython发行版(例如CPython 3.6.8 )可能是个好主意。只安装numpy (python -m pip install numpy)。根据我的经验,在这种情况下setenv是不必要的。
  • 对我来说,OutOfProcess模式被证明是错误的。因此,我建议显式设置InProcess模式(对于R2019b之前的版本,OutOfProcess选项不存在,并且pyenv).
  • Do不要将上面的两个.m文件连接成一个- py.importlib语句似乎是预执行的,因此与pyenv.

冲突

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50951178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档