Cython无法编译

时间:2018-07-09 10:44:27

标签: windows mingw cython

我正在尝试在Windows7(64位)和WinPython上使用Cython编译以下普通代码:

文件testpy.py:

print("hello world from testpy.py file.")

文件compile.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("testpy",  ["testpy.py"]),
    #   ... all your modules that need be compiled ...
]
setup(
    name = 'My Program Name',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

我首先给出命令以使用mingw:

D:\myfolder> make_cython_use_mingw
cython has been set to use mingw32
to remove this, remove file "E:\WinPython\settings\pydistutils.cfg"

然后我给出命令进行编译:

D:\myfolder> python compile.py build_ext --inplace

该过程开始但以以下错误结束:

running build_ext
skipping 'testpy.c' Cython extension (up-to-date)
building 'testpy' extension
C:\MinGW\bin\gcc.exe -mdll -O -Wall -IE:\WinPython\python-3.6.5.amd64\include -IE:\WinPython\python-3.6.5.amd64\include -c testpy.c -o build
\temp.win-amd64-3.6\Release\testpy.o
In file included from E:\WinPython\python-3.6.5.amd64\include/Python.h:68:0,
                 from testpy.c:4:
E:\WinPython\python-3.6.5.amd64\include/pytime.h:122:12: warning: 'struct timeval' declared inside parameter list will not be visible outsid
e of this definition or declaration
     struct timeval *tv,
            ^~~~~~~
E:\WinPython\python-3.6.5.amd64\include/pytime.h:127:12: warning: 'struct timeval' declared inside parameter list will not be visible outsid
e of this definition or declaration
     struct timeval *tv,
            ^~~~~~~
writing build\temp.win-amd64-3.6\Release\testpy.cp36-win_amd64.def
C:\MinGW\bin\gcc.exe -shared -s build\temp.win-amd64-3.6\Release\testpy.o build\temp.win-amd64-3.6\Release\testpy.cp36-win_amd64.def -LE:\Wi
nPython\python-3.6.5.amd64\libs -LE:\WinPython\python-3.6.5.amd64\PCbuild\amd64 -lpython36 -o D:\myfolder\testpy.cp36-win_amd64.pyd
Cannot export PyInit_testpy: symbol not defined
collect2.exe: error: ld returned 1 exit status
error: command 'C:\\MinGW\\bin\\gcc.exe' failed with exit status 1

问题出在哪里,如何解决?

编辑: 按照@ead在注释中建议将py文件重命名为pyx时,它可以创建pyd文件。但是,尝试时会出现以下错误:

D:\Myfolder>python -c "import Testpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: DLL load failed: %1 is not a valid Win32 application.

为什么这不是有效的Win32应用程序?

我的python版本如下:

Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32

编辑:我发现我也单独安装了mingw(除了winpython的一部分)。我删除了该文件,然后重试。我现在遇到以下错误:

python compile.py build_ext --inplace
Traceback (most recent call last):
  File "compile.py", line 12, in <module>
    ext_modules = ext_modules
  File "E:\WinPython\python-3.6.5.amd64\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "E:\WinPython\python-3.6.5.amd64\lib\distutils\dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "E:\WinPython\python-3.6.5.amd64\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "E:\WinPython\python-3.6.5.amd64\lib\site-packages\Cython\Distutils\old_build_ext.py", line 186, in run
    _build_ext.build_ext.run(self)
  File "E:\WinPython\python-3.6.5.amd64\lib\distutils\command\build_ext.py", line 308, in run
    force=self.force)
  File "E:\WinPython\python-3.6.5.amd64\lib\distutils\ccompiler.py", line 1031, in new_compiler
    return klass(None, dry_run, force)
  File "E:\WinPython\python-3.6.5.amd64\lib\distutils\cygwinccompiler.py", line 282, in __init__
    CygwinCCompiler.__init__ (self, verbose, dry_run, force)
  File "E:\WinPython\python-3.6.5.amd64\lib\distutils\cygwinccompiler.py", line 126, in __init__
    if self.ld_version >= "2.10.90":
TypeError: '>=' not supported between instances of 'NoneType' and 'str'

如何纠正?

0 个答案:

没有答案