Cython导入只工作一次,然后会出现gcc.bat错误



我正在64位Windows8机器上用Anaconda/Spyder编写一个Python程序。我正在了解gcc.bat的所有已知问题("gcc.bat'失败,退出状态为1"),我几乎已经修复了它。我的pyx文件(称为testFunc.pyx)有以下代码:

import numpy as np
cimport numpy as np
def funcMatUtility(np.ndarray[np.float64_t, ndim=1] vecX,
                   np.ndarray[np.float64_t, ndim=1] vecE):
    cdef np.ndarray[np.float64_t, ndim=2] out = 
        np.zeros((len(vecX),len(vecE)),dtype=np.float64)
    for iX, valX in enumerate(vecX):
        for iE, valE in enumerate(vecE):
            out[iX,iE] = valX + valE
    return out

我通过在Spyder中运行以下py文件来调用此函数:

import os
import numpy as np
import pyximport
os.environ['CPATH'] = np.get_include()
mingw_setup_args = { 'options': { 'build_ext': { 'compiler': 'mingw32' } } }
pyximport.install(setup_args=mingw_setup_args)
import testFunc
x = testFunc.funcMatUtility(np.array([0.0,1.0,2.0]),np.array([0.0,1.0,2.0,3.0]))

如果没有os.environ['CPATH'] = np.get_include()行,我会立即得到gcc.bat错误消息。如果没有install()中的设置参数,我会得到另一条错误消息:Unable to find vcvarsall.bat

因此,通过这些行,我可以编译我的Cython代码,这表明这正是我在Windows机器上运行Cython编译器所需要的。然而,问题是我只能做一次。如果想再次导入它,例如,因为我仍在开发代码,并且只进行了一次测试运行,我会再次收到gcc.bat错误消息(gcc.bat failed with exit status 1),除非我关闭并重新打开Spyder。我尝试了仅使用import语句的第二次导入(即不再导入pyximport),但没有成功。为什么我只能编译一次Cython代码?

我想我发现了问题(因此找到了解决方案):我需要告诉编译器我正在使用numpy。我在这里找到了解释:https://github.com/cython/cython/wiki/InstallingOnWindows

所以py文件应该是

import numpy
import pyximport
pyximport.install(
    setup_args={"script_args":["--compiler=mingw32"],
    "include_dirs":numpy.get_include()},reload_support=True)
import testFunc
x = testFunc.funcMatUtility(np.array([0.0,1.0,2.0]),np.array([0.0,1.0,2.0,3.0]))

'include_dirs'部分告诉编译器我正在使用numpy。这适用于Spyder,也适用于重复运行。

相关内容

最新更新