python - Cython 导入工作一次 - 然后给出 gcc.bat 错误

标签 python c++ windows gcc cython

我正在 64 位 Windows 8 机器上使用 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,也适用于重复运行。

关于python - Cython 导入工作一次 - 然后给出 gcc.bat 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28861862/

相关文章:

python - pySVN - 获取给定 url 的标签列表

c++ - 错误 : Unknown module(s) in QT: qml quick - Qt Creator

c++ - 我想根据自己的参数使用 count_if

java - 如何在 Windows 上的 jenkins 中编译和运行一个简单的 java 文件

windows - 在文件中查找一行并替换下一行

python - 如何在 Linux 上安装 OpenAi 的 Gym Atari 依赖项?

python - 使用request python下载txt文件

windows - 使用 Delphi 在 Windows 7 中检测用户何时锁定/解锁屏幕

python - 为 python 设置 virtualenv 时出现错误的解释器错误

c++ - Matlab中的USRPs并行控制