使Cython在Anacondas上运行Python 3.4,Windows 7 64位

时间:2015-03-28 21:14:10

标签: python mingw cython anaconda

我刚刚使用Anaconda / Condas在我的Windows 7 64位机器上安装了Python 3.4。

当我运行"hello world" cython example时,我收到此错误:

[py34] C:\Users\Jon\Documents\GitHub\CythonFunctions\cython_funcs>python setup.py build_ext --inplace
running build_ext
building 'cython_funcs.hello' extension
C:\Anaconda\envs\py34\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Anaconda\envs\py34\include -IC:\Anaconda\envs\py34\include -c hello.c -o build\temp.win-amd64-3.4\Release\hello.o
writing build\temp.win-amd64-3.4\Release\hello.def
C:\Anaconda\envs\py34\MinGW\bin\gcc.exe -shared -s build\temp.win-amd64-3.4\Release\hello.o build\temp.win-amd64-3.4\Release\hello.def -LC:\Anaconda\envs\py34\libs -LC:\Anaconda\envs\py34\PCbuild\amd6
4 -lpython34 -lmsvcr100 -o C:\Users\Jon\Documents\GitHub\CythonFunctions\cython_funcs\cython_funcs\hello.pyd
build\temp.win-amd64-3.4\Release\hello.o:hello.c:(.text+0x314): undefined reference to `__imp__PyThreadState_Current'
build\temp.win-amd64-3.4\Release\hello.o:hello.c:(.text+0x493): undefined reference to `__imp__Py_NoneStruct'
build\temp.win-amd64-3.4\Release\hello.o:hello.c:(.text+0x97b): undefined reference to `__imp_PyExc_ImportError'
collect2.exe: error: ld returned 1 exit status
error: command 'C:\\Anaconda\\envs\\py34\\MinGW\\bin\\gcc.exe' failed with exit status 1

从搜索stackoverflow和google时,当gcc和python版本都不是32位或64位时会发生此错误。

我已经检查过我的Python是64位。从下面的路径可以看出,我所拥有的MinGW是我的Python安装的一部分。如何检查它是否为64位?或者这个错误可能是由于其他原因造成的?

更新

奇怪的是,Ipython cythonmagic命令在这里工作正常:

http://docs.cython.org/src/quickstart/build.html?highlight=cythonmagic

4 个答案:

答案 0 :(得分:2)

一种方法是conda remove libpython(这将导致distutils不使用mingw),并安装Visual Studio 2010,并使用它进行编译。

答案 1 :(得分:1)

您的gcc行缺少定义:WITH cteFiltered AS (select c.Name as Hall, b.Title, Convert(time,a.StartFilmTime) as StartFilm, Convert(time,a.EndFilmTime) as EndTime from FilmSchedule a left join Film b on a.FilmId = b.Id left join Room c on a.RoomId = c.Id where a.ApproveStatus = 1 and a.Status = 1 and CONVERT(date, a.StartFilmTime) = '05-06-2015' ) select a.Hall, a.Title, STUFF((SELECT ', ' + '[' + CONVERT(varchar(2),DATEPART(Hour, b.StartFilm)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.StartFilm)) + ' ' + CONVERT(varchar(2),DATEPART(Hour, b.EndTime)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.EndTime)) + ']' FROM cteFiltered b Where a.Hall = b.Hall and a.Title = b.Title order by b.StartFilm -- *** FOR XML PATH('')),1,1,'') As ShowTime from cteFiltered a group by a.Hall, a.Title order by ShowTime; -- *** Hour is first (assuming 24H format) and only one day 。 Anaconda(我推测)修改了2.7 envs的-DMS_WIN64中的文件cygwinccompiler.py,但这种修改在3.4 env的distutils中不存在。我得到了不同的错误,但这个改变修复了我的设置。

答案 2 :(得分:0)

我遇到了与Anaconda类似的问题,但是当我停止尝试在py34目录中编译时它起了作用。而是将您的helloworld.pyx文件(确保将其更改为扩展名.pyx)与setup.py一起放在Anaconda3文件夹中,当您编译时确保您也在Anaconda3文件夹中,因此C:\ Anaconda3 python setup.py build_ext --inplace。如果内存服务,那就运行得很好。

答案 3 :(得分:0)

这可能适用于链接问题(要在临时目录中完成; 复制而不是 cp ,如果不在msys2环境中)

gendef c:/Windows/System32/python34.dll
dlltool -U -d python34.def -l libpython34.dll.a
cp libpython34.dll.a c:/Python34/libs

如果 gendef 无法访问 python34.dll ,可以在 gendef 命令之前使用Windows资源管理器复制它。

gendef 至少可以使用 mingw-w64 包。