我认识到将数字传递给 cython 中的函数的奇怪行为,其值大于 65535。但这只有在将这些数字传递给函数时才会出现。如果我将它们定义为
cdef long long a = 145574697
一切正常。为了澄清我的问题,我通过了我用来调查这个问题的两个虚拟函数
def bigNum1():
cdef long long a = 500000
cdef long long b = 10547746498
cdef long long c = 65536
cdef long long d = 65535
print(a, b, c, d)
def bigNum2(long long a, long long b, long long c, long long d):
print(a, b, c, d)
以及被调用以获取“.pyd”文件的“setup.py”。
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("bigNumbers.pyx")
)
之后我用命令创建了“.pyd”文件
python setup.py build_ext --inplace
使用命令提示符。使用的 c 编译器是 gcc。
如果我然后调用“bigNum1”或“bigNum2”,将产生以下输出。
bigNum1: (500000, 10547746498, 65536, 65535)
bigNum2: (41248, 442029762, 0, 65535).
如您所见,所有大于 65535 的数字都显示错误,使用 bigNum2。跟着你看到这个函数的调用。
import bigNumbers
bigNumbers.bigNum1()
a = 500000
b = 10547746498
c = 65536
d = 65535
bigNumbers.bigNum2(a, b, c, d)
我希望你能理解我的问题。我的猜测是,我在 bigNum2 中做了错误的声明,导致类型错误,或者我必须在将数字传递给此方法之前进行某种类型转换。
编辑:
这是cmd提示符过程中显示的文字
python setup.py build_ext --inplace
Compiling bigNumbers.pyx because it changed.
[1/1] Cythonizing bigNumbers.pyx
running build_ext
building 'bigNumbers' extension
D:\WinPython3610\cgg64Bit\bin\gcc.exe -mdll -O -Wall -ID:\WinPython3610\python-3
.6.1.amd64\include -ID:\WinPython3610\python-3.6.1.amd64\include -c bigNumbers.c
-o build\temp.win-amd64-3.6\Release\bignumbers.o
writing build\temp.win-amd64-3.6\Release\bigNumbers.cp36-win_amd64.def
D:\WinPython3610\cgg64Bit\bin\gcc.exe -shared -s build\temp.win-amd64-3.6\Releas
e\bignumbers.o build\temp.win-amd64-3.6\Release\bigNumbers.cp36-win_amd64.def -L
D:\WinPython3610\python-3.6.1.amd64\libs -LD:\WinPython3610\python-3.6.1.amd64\P
Cbuild\amd64 -lpython36 -lvcruntime140 -o L:\User\neon3_worksp
ace\CythonSource\src\bigNumbers.cp36-win_amd64.pyd
编辑2:
我使用 cython 0.25.2 附带的 Winpython 包“WinPython 3.6.1.0Qt5-64bit”。但我用 pip 升级它以获得最新版本。
首先,我尝试使用此处的教程获取我的 .pyd。
http://docs.cython.org/en/latest/src/quickstart/build.html
但在构建过程中,我收到一条错误消息“错误:无法找到 vcvarsall.bat”。这就是为什么我决定将 Mingw 与 gcc 一起使用。但这也产生了一个错误,在这篇文章中有描述。
我用 Indrajit Kanjilal 的回答解决了这个问题。我们现在就在那里。我可以创建一个 .pyd 文件,可以调用该函数,但如果该值大于 65535,则会发生错误。希望有帮助。