cython打印错误的数字值大于65535

时间:2017-10-12 06:33:45

标签: python cython python-3.6 cythonize

我认识到在cython中传递给函数的数字的奇怪行为,其值大于65535.但这只会在将这些数字传递给函数时出现。如果我将它们定义为

tools
一切正常。为了澄清我的问题,我通过了用于调查此问题的两个虚拟函数

cdef long long a = 145574697

调用“setup.py”来获取“.pyd”文件。

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”文件
from distutils.core import setup
from Cython.Build import cythonize


setup(
    ext_modules = cythonize("bigNumbers.pyx")
)

使用命令提示符。使用过的c编译器是gcc。

如果我再调用“bigNum1”或“bigNum2”,将会产生以下输出。

python setup.py build_ext --inplace

如您所见,使用bigNum2显示所有大于65535的数字都显示错误。接下来你看到了这个函数的调用。

bigNum1: (500000, 10547746498, 65536, 65535)
bigNum2: (41248, 442029762, 0, 65535).

我希望你理解我的问题。 我的猜测是,我在bigNum2中做了一个错误的声明导致了错误的类型,或者在将数字传递给此方法之前我必须进行某种类型转换。

修改

这是cmd提示过程中显示的文本

import bigNumbers

bigNumbers.bigNum1()

a = 500000
b = 10547746498
c = 65536
d = 65535


bigNumbers.bigNum2(a, b, c, d)

EDIT2:

我使用了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。但这也造成了一个错误,这篇文章对此进行了描述。

ValueError: Unknown MS Compiler version 1900

我用Indrajit Kanjilal的答案解决了这个问题。我们现在在那里。我可以创建.pyd文件,可以调用该函数,但如果该值大于65535则会发生错误。希望有所帮助。

1 个答案:

答案 0 :(得分:1)

简而言之,在链接时不要混合编译器。

此处的问题与Cython无关,但使用

  1. Visual Studio构建了Python发行版
  2. MingW GCC构建了Python扩展
  3. 并将它们连接在一起。由于编译器实现的差异,特别是对于上面的Visual Studio以不同方式实现 long ints ,这将以各种有趣的方式打破。

    编写Python扩展时,最好始终使用与Python发行版相同的编译器来构建扩展。

    对于官方Python发行版,这些是Py Studio 2.6到3.6的Visual Studio 9到15 - 请参阅Which Microsoft Visual C++ compiler to use with a specific Python version on the Python wiki

    解决方案要么使用Visual Studio 15.0(又名VS 2014,用于Python 3.6),要么使用conda环境构建包括Python和GCC在内的所有内容。