我在64位Windows计算机上使用Anacondas。

我已经编写了一个世界Cython例子。 它位于文件hello.pyx中,并包含:

def say_hello_to(name):
    print("Hello %s!" % name)

我正在使用run_hello.py运行它

import pyximport; pyximport.install()
import hello as hello

hello.say_hello_to('jon')

设置文件为setup.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(
  name = 'Hello world app',
  ext_modules = cythonize("hello.pyx"),
)

然后,我使用以下代码在Anacondas上的Python 3.3中编译代码:

> activate py33
> python setup.py build_ext --inplace

(请注意py33是我的Python 3.3环境)

然后,我可以运行示例:

python run_hello.py

上面打印出“你好乔恩!” 如预期的那样。

现在,如果我将环境更改为Python 3.4并进行编译:

> activate py34
> python setup.py build_ext --inplace

我没有错误,并且外壳显示

running build_ext

但是,如果我尝试从py34环境运行run_hello.py:

python run_hello.py

我得到:

Traceback (most recent call last):
  File "run_hello.py", line 2, in <module>
    import hello as hello
ImportError: DLL load failed: The specified module could not be found.

该错误不是很具描述性。 我该怎么做才能在Python 3.4上完成这项工作?


如果我从硬盘驱动器中删除hello.c和/ build文件夹,则尝试从Python 3.4进行编译将返回:

Compiling hello.pyx because it changed.
Cythonizing hello.pyx
running build_ext
building 'hello' extension
creating build
creating build\temp.win-amd64-3.4
creating build\temp.win-amd64-3.4\Release
C:\Anaconda\envs\py34\Scripts\gcc.bat -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\Scripts\gcc.bat -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\amd64
-lpython34 -lmsvcr100 -o c:\Users\Jon\Documents\GitHub\CythonFunctions\example1\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\\Scripts\\gcc.bat' failed with exit status 1

如果我对Python 3.3做同样的事情,我得到:

Compiling hello.pyx because it changed.
Cythonizing hello.pyx
running build_ext
building 'hello' extension
creating build
creating build\temp.win-amd64-3.3
creating build\temp.win-amd64-3.3\Release
C:\Anaconda\envs\py33\Scripts\gcc.bat -DMS_WIN64 -mdll -O -Wall -IC:\Anaconda\envs\py33\include -IC:\Anaconda\envs\py33\include -c hello.c -o build\temp.win-amd64-3.3\Release\hello.o
writing build\temp.win-amd64-3.3\Release\hello.def
C:\Anaconda\envs\py33\Scripts\gcc.bat -DMS_WIN64 -shared -s build\temp.win-amd64-3.3\Release\hello.o build\temp.win-amd64-3.3\Release\hello.def -LC:\Anaconda\envs\py33\libs -LC:\Anaconda\envs\py33\PCb
uild\amd64 -lpython33 -lmsvcr100 -o c:\Users\Jon\Documents\GitHub\CythonFunctions\example1\hello.pyd

其他一些遇到“ gcc.bat失败,退出状态为1”的用户发现此问题是由于32/64位冲突引起的。

在py33版本的编译数据中,gcc.bat参数中有-DMS_WIN64,但在py34参数中却没有。 那可能是引起我问题的原因吗? 如果是这样,如何获取py34进行添加?

#1楼 票数:2

几年来,我一直在使用TDM-GCC作为Python 2.7 64位的64位编译器,没有任何问题,但是在安装Python 3.4 64位之后,我确实在编译Cython模块时遇到了问题。

我相信我用mingw-w64-for-python解决了这个问题。 (也请看一下这个github 问题 )。

有一个自述文件(当前为mingwpy-2015-04-readme.pdf ),因此很简单。 但简短地说,您需要执行以下操作:

  1. 下载mingwpy x86-64工具链(64位)(当前mingw64static-2014-11.tar.xz
  2. 将文件解压缩到目录中(例如C:\\mingw64static
  3. Path环境变量的C:\\Anaconda3\\Scripts前面添加C:\\mingw64static\\bin
  4. 按照readme文件中的说明下载libpython (我为Python 3.4 64位使用libpython-cp34-none-win_amd64.7z
  5. 解压缩文件并将存档中的文件( libmsvcr100.alibpython34.dll.a )复制到C:\\Python\\libs\\目录(对于Anaconda,则为C:\\Anaconda3\\libs
  6. C:\\Python\\Lib\\distutils目录中创建一个名为distutils.cfg的文件(对于Anaconda,它是C:\\Anaconda3\\Lib\\distutils ),其内容如下:

     [build] compiler=mingw32 

现在,当您编译cython模块时,python将正确使用mingw-w64

#2楼 票数:0

看起来py33环境正在使用Visual Studio( -lmsvcr100 )进行编译。 这可能是因为它没有安装libpython conda软件包,这导致distutils使用mingw(gcc)而不是Visual Studio进行编译。 conda remove libpython可能会为您的Python 3.4环境解决该问题。

  ask by Ginger translate from so

未解决问题?本站智能推荐:

1回复

在Windows 7下使用python 3.3(Anaconda)构建最小的cython文件

当我尝试在Windows 7下使用Python 3.3(Anaconda 3)构建一个最小的Cython文件test.pyx时,我得到一个奇怪的错误: 当然test.pyx在工作目录中。 它在使用Python 2.7(Anaconda)的Windows下运行,在Linux下使用Pyth
1回复

Python崩溃与最小的Cython模块(Python3,Anaconda3,Windows7)

我尝试在Windows 7下使用Cython和Python3(Anaconda3)。通过编辑文件cygwinccompiler.py解决了distutils中的错误(参见在Windows 7下使用python 3.3(Anaconda)构建最小的cython文件 ),可以构建模块没有任何问题:
4回复

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

我刚刚使用Anaconda / Condas在我的Windows 7 64位机器上安装了Python 3.4。 当我运行“hello world”cython示例时,我收到此错误: 从搜索stackoverflow和谷歌,当gcc和python版本不是32位或64位时,会发生此错误
1回复

对于基本求和计算,Cython并不比Python快得多

我试图按照Continuum Analytics博客上的一个例子来对Python,Cython,Numba进行基准测试,以获得使用for循环计算的总和。 不幸的是,我发现Cython比Python慢​​! 这是我的Python函数定义: 现在我的Cython功能: 现在我
1回复

编译cython代码时,Anaconda3 python 3.5中的CompileError。 有人可以帮我吗?

当使用import pyximport导入cython代码时,平台是使用Microsoft vision studio 2015的window 7。 pyximport.install(),弹出错误消息。 我什至不知道要解决它,即使我已经为这类问题做了很多搜索。 谢谢。 原始代码是某人,
1回复

如何让64位Anaconda Python在Windows上找到Cython的MS C编译器?

如何让64位Anaconda Python在Windows上找到Cython的MS C编译器? 在Anaconda Python中,您运行setup.py文件来编译* .pyx源代码文件。 Anaconda Python 2.7非常智能,可以实现它需要MS 9.0编译器,但它抱怨它无法找
1回复

Cython编译为exe,Windows

我在Windows上将Cython生成的C代码编译为EXE时遇到问题。 Windows 10 Python 3.5、32位元,Anaconda Visual Studio 14.0 使用这个 stackoverflow线程,我能够使用命令行将test.py转换为test.c
2回复

Windows 64和GSL中的Cython

我正在尝试编译以下pyx代码: 这是我的setup.py文件的样子: GSL文件包含在C:\\ Users \\ MyName \\ Anaconda \\ gsl \\ include \\ gsl,C:\\ Users \\ MyName \\ Anaconda \\ gsl