cython在winpython上工作得很好但在anaconda上却没有 - 链接问题

时间:2015-07-23 20:46:27

标签: cython anaconda

我有一个在WinPython下运行并运行良好的Cython代码,但是当我从WinPython切换到Anaconda3时,我遇到了问题。我正在使用Python 3.4

测试代码是:

# cython: boundscheck=False
# cython: wraparound=False
# cython: cdivision=True

cimport cython
cimport numpy as np
import numpy as np
from numpy cimport ndarray as ar
from libc.math cimport *


cpdef ar[double, ndim=1, mode='c'] test(ar[double, ndim=1, mode='c'] x):
    cdef:
        int n = x.shape[0]
        Py_ssize_t i
        ar[double, ndim=1, mode='c'] y = np.zeros(n)*np.nan
    with nogil:
        for i in range(0, n):
            y[i] = x[i]+1
    return y

编译代码是:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np

ext_modules = [Extension('test', ['tech/test.pyx'], include_dirs=[np.get_include()],
                         define_macros=[('NPY_NO_DEPRECATED_API', None)],
                         extra_compile_args=['-O3', '-march=native', '-ffast-math'],
                         libraries=['m']
                         )]

setup(
    name="Test Function",
    cmdclass={'build_ext': build_ext},
    ext_modules=ext_modules
)

我正在使用MinGw进行编译,所以在...\Anaconda3\Lib\distutils文件夹下我有一个文件

[build]
compiler = mingw32

另外在PATH环境变量中,我有:

默认:     ... \ Anaconda3     ... \ Anaconda3 \脚本

还补充说:     ... \ Anaconda3 \ libs(包含python34)

还添加了:从WinPython复制的包含gcc等的mingw32文件:     ... \ Anaconda3 \ Tools \ tools \ mingw32 \ bin(这包含gcc)     ... \ Anaconda3 \工具\工具\的mingw32 \ x86_64的-W64-的mingw32 \ BIN

当我尝试:

python setup.py build_ext --inplace

代码运行正常,直到生成test.ctest.otest.def为止。此后这就是我得到的:

C:\Anaconda3\Tools\tools\mingw32\bin\gcc.exe -shared -s build\temp.win-amd64-3.4\Release\tech\test.o build\temp.win-amd64-3.4\Release\tech\test.def -LC:\Anaconda3\libs -LC:\Anaconda3\PCbuild\amd64 -lm -lpython34 -lmsvcr100 -

o P:\ Documents \ Temp \ python-master \ python-master \ common \ test.pyd

build\temp.win-amd64-3.4\Release\tech\test.o:test.c:(.text+0x8e): undefined reference to `__imp_PyExc_TypeError'

build\temp.win-amd64-3.4\Release\tech\test.o:test.c:(.text+0x10e): undefined reference to `__imp_PyExc_ValueError'

build\temp.win-amd64-3.4\Release\tech\test.o:test.c:(.text+0x259): undefined reference to `__imp__PyThreadState_Current'
....
....
C:/Anaconda3/Tools/tools/mingw32/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw3                ild\temp.win-amd64-3.4\Release\tech\test.o: bad reloc address 0x0 in section `.data'
collect2.exe: error: ld returned 1 exit status                                                                        
error: command 'C:\\Anaconda3\\Tools\\tools\\mingw32\\bin\\gcc.exe' failed with exit status 1   
  1. 首先,我无法在任何地方找到Anacond3\PCBuild\amd64目录/文件。

  2. 我试图浏览互联网,但找不到__imp_PyExc_TypeError__imp__PyThreadState_Current__imp_PyExc_ValueError的任何引用。

  3. 最终转换为*.pyd文件可能出现什么问题?

2 个答案:

答案 0 :(得分:1)

我怀疑Anaconda还不支持mingw-64。

历史上,mingw-64确实是一个毫无希望的想法,直到Cark Kleffner带来他的静态版本。

当Carl的更新版本可以作为mingwpy wheel使用时,事情可能(应该?)改变。

答案 1 :(得分:1)

你可以运行

conda remove libpython

使Anaconda使用Visual Studio而不是mingw,这可能会更好。