2015-03-04 3 views
1

Я пишу программу Python в Anaconda/Spyder на 64-битной машине Windows 8. Я получаю все проблемы с gcc.bat («gcc.bat» не удалось с статусом выхода 1 »), и я исправил его - почти. Мой файл дарохранительница (так называемый testFunc.pyx) имеет следующий код:Cython import работает один раз - и затем дает ошибку gcc.bat

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 

Я называю эту функцию, выполнив следующую py файл в Spyder:

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 в первую очередь. Проблема, однако, в том, что я могу сделать это только один раз. Если вы хотите импортировать его снова, например, потому что я все еще разрабатываю свой код, и я только выполнил пробный запуск, я снова получаю сообщение об ошибке gcc.bat (gcc.bat failed with exit status 1), если я не закрою и не открою Spyder. Я попробовал второй импорт только с оператором import (т. Е. Не импортировал pyximport), но безрезультатно. Что может быть причиной того, что я могу только скомпилировать код Cython?

ответ

0

Я думаю, что нашел проблему (и, следовательно, решение): Мне нужно сообщить компилятору, что я использую 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, также в многократных тиражах.

Смежные вопросы