【发布时间】:2026-02-15 04:20:03
【问题描述】:
所以,这是另一个 Windows + cython 问题... Cython 确实成功地编译了一些简单的脚本(尽管不是全部),并且 gcc 在大多数情况下都会以错误代码退出。我已将Setup.py 配置为使用来自Setup.cfg 的MingW32 作为编译器。我也安装了 MCVS express,但使用它作为编译器似乎需要我拥有 2008 版本,现在找不到了。我读了很多关于在 Windows 上 cythonize 失败的文章,但我找不到魔术。似乎任何包含cdef 的脚本都将无法编译。有人可以帮忙吗?
配置:
- Windows 8.1(当然是 x64)
- Python 2.7.6 32 位
- 为 32 位窗口预编译的 Cython 0.20.2
- Microsoft Visual Studio Express 2013
测试项目:
- test.py
- setup.py
- setup.cfg
Setup.cfg:
[build]
compiler = mingw32
Setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("test.py")
)
有效的test.py:
def say_hello_to(name):
print("Hello %s!" % name)
失败的test2.py(相应地更改Setup.py):
def primes(int kmax):
cdef int n, k, i
cdef int p[1000]
result = []
if kmax > 1000:
kmax = 1000
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] != 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
Mingw32 错误输出:
PS C:\Users\Raoul\Desktop\cython_trys> python setup.py build_ext --inplace
Compiling test2.py because it changed.
Cythonizing test2.py
Error compiling Cython file:
------------------------------------------------------------
...
def primes(int kmax):
^
------------------------------------------------------------
test2.py:1:15: Expected ')', found 'kmax'
Traceback (most recent call last):
File "setup.py", line 6, in <module>
ext_modules = cythonize("test2.py")
File "C:\Python27\lib\site-packages\Cython\Build\Dependencies.py", line 798, in cythonize
cythonize_one(*args[1:])
File "C:\Python27\lib\site-packages\Cython\Build\Dependencies.py", line 915, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: test2.py
【问题讨论】:
-
错误消息是来自文件系统的“权限被拒绝”,与代码无关。任何机会你构建了第一个,
imported 到 Python 交互式解释器或脚本中,然后,没有退出,尝试在完全相同的路径中构建第二个,从而试图覆盖仍然打开的现有的,并且锁定? -
您将 Cython 文件命名为 .py 而不是 .pyx 是否有原因?此外,如果这真的是您的代码,那么显然有
IndentationError;问题仅仅是 Cython 给你错误的错误信息吗?