在IPython中运行%% cython-magic单元时,“ CompileError / LinkerError:“命令'gcc'失败,退出状态为1””是什么意思

时间:2019-08-30 12:25:14

标签: python ipython cython

有时候,当我在IPython笔记本中运行%% cython-cell时,我会得到很长的回溯,并以非常短的错误消息结尾:

  

CompileError:命令'gcc'失败,退出状态为1

  

LinkError:命令'gcc'失败,退出状态为1

在Windows上,相应的消息是:

  

CompileError:命令'C:。\ Microsoft Visual Studio \ .. \ cl.exe'失败,退出状态为X

  

LinkError:命令'C:.. \ Microsoft Visual Studio \ .. \ link.exe'失败,退出状态为YYYY

是否可以获得有关潜在错误的更精确信息?

这种%% cython-cell的示例如下:

[1] %load_ext Cython
[2] %%cython
    from sklearn.tree._tree cimport Node
    print("loaded")

1 个答案:

答案 0 :(得分:1)

%%cython魔术师使用distutils在引擎盖下构建Cython扩展,而IPython 不是不会捕获输出gcc或其他编译器/链接器记录为标准错误/输出。

要查看编译器/链接器记录的错误和警告,必须转到编译器记录错误的位置,这取决于IPython的启动方式。

IPython / Jupiter笔记本

从终端启动笔记本电脑时,例如通过ipython notebook或类似的命令,则可以在此终端中看到编译器的输出-我们看到上述单元格的问题是:

  

/home/ed/.cache/ipython/cython/_cython_magic_5f6d267a6f541c572b4517a74d5c9aad.c:607:31:   严重错误numpy/arrayobject.h:没有这样的文件或目录   编译终止。

缺少numpy标头,可以在numpy.get_include()中找到。

IPython控制台

如果从终端启动IPython,则将错误直接记录到IPython控制台。但是请注意:编译器/链接器的输出将直接出现在错误跟踪的开头:

 >>> ipython
Python 3.7.3 (default, Mar 27 2019, 22:11:17) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.                                                                       

In [1]: %load_ext Cython                                                        

In [2]: %%cython 
   ...: from sklearn.tree._tree cimport Node 
   ...: print("loaded") 
   ...:  
   ...: 
/home/ed/.cache/ipython/cython/_cython_magic_1182f410e5c0a56b03b28dd88700704d.c:607:31: fatal error: numpy/arrayobject.h: No such file or directory
compilation terminated.
---------------------------------------------------------------------------
DistutilsExecError                        Traceback (most recent call last)
....

CompileError: command 'gcc' failed with exit status 1

第一行告诉我们我们需要知道的一切!

Spyder:

至少从Spyder 3.3.3开始,在IPython控制台中可以看到编译器/链接器的输出(与独立的IPython控制台中的输出相同)。


示例%% cython-cell可以固定如下:

%%cython -I <path from numpy.get_include()>
from sklearn.tree._tree cimport Node
print("loaded")