【问题标题】:How to solve numpy import error when calling Anaconda env from Matlab从Matlab调用Anaconda env时如何解决numpy导入错误
【发布时间】:2018-11-29 18:16:56
【问题描述】:

我想从 Matlab 执行 Python 脚本(在 Windows 7 机器上)。必要的库安装在 Anaconda 虚拟环境中。从命令行运行脚本时,它运行完美。

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

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

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 环境,但没有更改:

   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 作品。重新加载 numpy (py.importlib.import_module('numpy');) 不起作用,但抛出了与以前相同的错误。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 您是否尝试按照错误消息的建议重新安装 numpy?
  • 感谢您的建议,但正如我所写,numpy 安装没有问题,因为它从命令行运行得非常好。事实上,问题在于 Matlab 使用的是在使用 Anaconda 虚拟环境时未设置的路径变量。变通的解决方案是从虚拟环境中调用 Matlab(或手动将相应的路径添加到路径环境)。

标签: matlab numpy anaconda python-3.5 importerror


【解决方案1】:

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

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

【讨论】:

  • 你最终让它工作了吗?您必须设置哪些环境变量?
  • 我没有更改我的环境变量,而是从我的虚拟环境中调用了 Matlab。所以我像往常一样通过命令行激活了anaconda环境,然后调用了“Matlab”。这会在环境中打开 Matlab,因此 Matlab 可以访问所有必要的库。
  • 如果您想将环境变量添加到您的路径中: 1. 激活您的 anaconda 虚拟环境 2. 检查/复制 anaconda 环境中的路径变量(例如设置 %PATH%) 3. 停用您的anaconda env,检查您的“真实”路径变量并确定路径环境中缺少哪些并添加它们。希望有帮助!
【解决方案2】:

第一种方法

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

pyversion("/home/nibalysc/Programs/anaconda3/bin/python");

并检查它:

pyversion();

你也可以这样做

启动.m

您的项目文件夹中的文件,每次您从该文件夹启动 MATLAB 时,python 解释器都会自动更改。

现在你可以尝试使用:

py.importlib.import_module('numpy');

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

Call user defined custom module
Call modified python module

替代方法

另一种方法是创建一个

matlab_shell.sh

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

#!/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 文件中也这样做:

setenv("MATLAB_SHELL", "/path/to/matlab_shell.sh");

之后,您可以使用 system(...) 函数运行 conda python 并安装所有模块...

字符串表示法:

system("python -c ""python code goes here"");

字符表示法:

system('python -c "python code goes here"');

希望这会有所帮助!

【讨论】:

    【解决方案3】:

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

    目前(我使用 R2019b 更新 5)存在许多陷阱,可能会导致与您类似的问题。我建议从以下开始:

    1. 创建一个新的干净的 conda 环境:
    conda create -n test_py36 python=3.6 numpy
    
    1. 创建以下虚拟对象demo1.py
    def dummy_py_method(x):
        return x+1
    
    
    1. 创建以下run_py_code.m
    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
    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)。

    • 不要将上面的两个 .m 文件合并为一个 - py.importlib 语句似乎是预先执行的,因此与 pyenv 冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多