PythonLevenshtein Distance Error“断言失败!”

2024-09-30 16:36:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Anaconda'3.4.1 |Anaconda 2.1.0 (64-bit)| (default, Sep 24 2014, 18:32:42) [MSC v.1600 64 bit (AMD64)]'Windows8机器中的Python3.4.1。在

我安装的软件包pip install python-Levenshtein一切顺利没有错误。(版本0.12.0)

但后来我试着用它:

import Levenshtein as lvn
print(lvn.ratio('a', 'A'))

# This application has requested the Runtime to terminate it in an unusual way.
# Please contact the application's support team for more information.
# Assertion failed!
# 
# Program: C:\Users\Me\Anaconda-P3.x-64b\python.exe
# File: Levenshtein/_levenshtein.c, Line 726
# 
# Expression: PyUnicode_Check(arg1)
# 
# Process finished with exit code 3

我尝试了print(lvn.ratio.__doc__),它可以很好地打印文档。 我还缺什么让这件事成功?这是我的Python的特定版本的问题,编译器错误,还是Levenshtein库中的错误

Levenshtein模块源代码可在Github上找到;崩溃行726是:

^{pr2}$


我能够在另一台安装了python3.4的windows8机器上重现这个错误(来自Anaconda包-我文章中的同一个包) 测试其他一些方法: distance()-完全相同的错误。 hamming()-相同的错误,但在第805行。 jaro()-相同的错误,但在第848行。

这次我试图在Python2.7上安装PythonLevenshtein,但我确实收到了一些警告。。。
C:\Users\Thomaz\Anaconda32b\Scripts>pip.exe install python-Levenshtein
Collecting python-Levenshtein
  Using cached python-Levenshtein-0.12.0.tar.gz
Requirement already satisfied (use --upgrade to upgrade): setuptools in c:\users
\thomaz\anaconda32b\lib\site-packages\setuptools-5.8-py2.7.egg (from python-Leve
nshtein)
Installing collected packages: python-Levenshtein
  Running setup.py install for python-Levenshtein
    building 'Levenshtein._levenshtein' extension
    C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Users\Thomaz\Anaconda32b\include -I
C:\Users\Thomaz\Anaconda32b\PC -c Levenshtein/_levenshtein.c -o build\temp.win32
-2.7\Release\levenshtein\_levenshtein.o
    Levenshtein/_levenshtein.c: In function 'levenshtein_common':
    Levenshtein/_levenshtein.c:711:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string1 = PyString_AS_STRING(arg1);
                 ^
    Levenshtein/_levenshtein.c:712:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string2 = PyString_AS_STRING(arg2);
                 ^
    Levenshtein/_levenshtein.c: In function 'hamming_py':
    Levenshtein/_levenshtein.c:796:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string1 = PyString_AS_STRING(arg1);
                 ^
    Levenshtein/_levenshtein.c:797:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string2 = PyString_AS_STRING(arg2);
                 ^
    Levenshtein/_levenshtein.c: In function 'jaro_py':
    Levenshtein/_levenshtein.c:840:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string1 = PyString_AS_STRING(arg1);
                 ^
    Levenshtein/_levenshtein.c:841:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string2 = PyString_AS_STRING(arg2);
                 ^
    Levenshtein/_levenshtein.c: In function 'jaro_winkler_py':
    Levenshtein/_levenshtein.c:890:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string1 = PyString_AS_STRING(arg1);
                 ^
    Levenshtein/_levenshtein.c:891:13: warning: pointer targets in assignment di
ffer in signedness [-Wpointer-sign]
         string2 = PyString_AS_STRING(arg2);
                 ^
    Levenshtein/_levenshtein.c: In function 'median_common':
    Levenshtein/_levenshtein.c:992:7: warning: pointer targets in passing argume
nt 1 of 'PyString_FromStringAndSize' differ in signedness [-Wpointer-sign]
           result = PyString_FromStringAndSize(medstr, len);
           ^
    In file included from C:\Users\Thomaz\Anaconda32b\include/Python.h:94:0,
                     from Levenshtein/_levenshtein.c:99:
    C:\Users\Thomaz\Anaconda32b\include/stringobject.h:62:24: note: expected 'co
nst char *' but argument is of type 'lev_byte *'
     PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t)
;
                            ^
    Levenshtein/_levenshtein.c: In function 'median_improve_common':
    C:\Users\Thomaz\Anaconda32b\include/stringobject.h:91:32: warning: pointer t
argets in initialization differ in signedness [-Wpointer-sign]
     #define PyString_AS_STRING(op) (((PyStringObject *)(op))->ob_sval)
                                    ^
    Levenshtein/_levenshtein.c:1071:19: note: in expansion of macro 'PyString_AS
_STRING'
         lev_byte *s = PyString_AS_STRING(arg1);
                       ^
    Levenshtein/_levenshtein.c:1077:7: warning: pointer targets in passing argum
ent 1 of 'PyString_FromStringAndSize' differ in signedness [-Wpointer-sign]
           result = PyString_FromStringAndSize(medstr, len);
           ^
    In file included from C:\Users\Thomaz\Anaconda32b\include/Python.h:94:0,
                     from Levenshtein/_levenshtein.c:99:
    C:\Users\Thomaz\Anaconda32b\include/stringobject.h:62:24: note: expected 'co
nst char *' but argument is of type 'lev_byte *'
     PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t)
;
                            ^
    Levenshtein/_levenshtein.c: In function 'extract_stringlist':
    Levenshtein/_levenshtein.c:1201:16: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
         strings[0] = PyString_AS_STRING(first);
                    ^
    Levenshtein/_levenshtein.c:1213:18: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
           strings[i] = PyString_AS_STRING(item);
                      ^
    Levenshtein/_levenshtein.c: In function 'editops_py':
    Levenshtein/_levenshtein.c:1650:13: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
         string1 = PyString_AS_STRING(arg1);
                 ^
    Levenshtein/_levenshtein.c:1651:13: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
         string2 = PyString_AS_STRING(arg2);
                 ^
    Levenshtein/_levenshtein.c: In function 'opcodes_py':
    Levenshtein/_levenshtein.c:1768:13: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
         string1 = PyString_AS_STRING(arg1);
                 ^
    Levenshtein/_levenshtein.c:1769:13: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
         string2 = PyString_AS_STRING(arg2);
                 ^
    Levenshtein/_levenshtein.c: In function 'apply_edit_py':
    Levenshtein/_levenshtein.c:1863:13: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
         string1 = PyString_AS_STRING(arg1);
                 ^
    Levenshtein/_levenshtein.c:1864:13: warning: pointer targets in assignment d
iffer in signedness [-Wpointer-sign]
         string2 = PyString_AS_STRING(arg2);
                 ^
    Levenshtein/_levenshtein.c:1878:7: warning: pointer targets in passing argum
ent 1 of 'PyString_FromStringAndSize' differ in signedness [-Wpointer-sign]
           result = PyString_FromStringAndSize(s, len);
           ^
    In file included from C:\Users\Thomaz\Anaconda32b\include/Python.h:94:0,
                     from Levenshtein/_levenshtein.c:99:
    C:\Users\Thomaz\Anaconda32b\include/stringobject.h:62:24: note: expected 'co
nst char *' but argument is of type 'lev_byte *'
     PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t)
;
                            ^
    Levenshtein/_levenshtein.c:1894:7: warning: pointer targets in passing argum
ent 1 of 'PyString_FromStringAndSize' differ in signedness [-Wpointer-sign]
           result = PyString_FromStringAndSize(s, len);
           ^
    In file included from C:\Users\Thomaz\Anaconda32b\include/Python.h:94:0,
                     from Levenshtein/_levenshtein.c:99:
    C:\Users\Thomaz\Anaconda32b\include/stringobject.h:62:24: note: expected 'co
nst char *' but argument is of type 'lev_byte *'
     PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t)
;
                            ^
    Levenshtein/_levenshtein.c: At top level:
    Levenshtein/_levenshtein.c:6630:1: warning: 'lev_editops_total_cost' defined
 but not used [-Wunused-function]
     lev_editops_total_cost(size_t n,
     ^
    Levenshtein/_levenshtein.c:6700:1: warning: 'lev_opcodes_total_cost' defined
 but not used [-Wunused-function]
     lev_opcodes_total_cost(size_t nb,
     ^
    Levenshtein/_levenshtein.c:6655:1: warning: 'lev_editops_normalize' defined
but not used [-Wunused-function]
     lev_editops_normalize(size_t n,
     ^
    Levenshtein/_levenshtein.c:2371:1: warning: 'lev_edit_distance_sod' defined
but not used [-Wunused-function]
     lev_edit_distance_sod(size_t len, const lev_byte *string,
     ^
    Levenshtein/_levenshtein.c:2550:1: warning: 'lev_u_edit_distance_sod' define
d but not used [-Wunused-function]
     lev_u_edit_distance_sod(size_t len, const lev_wchar *string,
     ^
    C:\MinGW\bin\gcc.exe -shared -s build\temp.win32-2.7\Release\levenshtein\_le
venshtein.o build\temp.win32-2.7\Release\levenshtein\_levenshtein.def -LC:\Users
\Thomaz\Anaconda32b\libs -LC:\Users\Thomaz\Anaconda32b\PCbuild -lpython27 -lmsvc
r90 -o build\lib.win32-2.7\Levenshtein\_levenshtein.pyd
Successfully installed python-Levenshtein-0.12.0

有趣。。。在Python2.7中,即使有上面的警告,一切都能正常工作。在



我卸载了这个包,然后从这里重新安装了这个包:http://www.lfd.uci.edu/~gohlke/pythonlibs/#python-levenshtein,现在我可以在python3.4中很好地使用pythonlevenshtein

Tags: instringasuserslevenshteintargetsassignmentwarning
1条回答
网友
1楼 · 发布于 2024-09-30 16:36:43

这只是一个部分的答案,我自己没有Windows,所以我无法调试错误。然而,只要看一下源代码就可以得出“这个bug是不可能的”的结论——可能是一个编译器的错误,或者是非常糟糕的UB,或者其他什么。在

扩展的编译方式可能有问题。在the line 726之前,对第722行和第723行进行检查,它们显式检查参数是否为Unicode对象或其子类(如果不是,则跳过整个if,而第726行不运行)

722 else if (PyObject_TypeCheck(arg1, &PyUnicode_Type)
723     && PyObject_TypeCheck(arg2, &PyUnicode_Type)) {
724   Py_UNICODE *string1, *string2;
725
726   len1 = PyUnicode_GET_SIZE(arg1);
727   len2 = PyUnicode_GET_SIZE(arg2);
728   *lensum = len1 + len2;
729   string1 = PyUnicode_AS_UNICODE(arg1);
730   string2 = PyUnicode_AS_UNICODE(arg2);

^{}有2个assert语句,它们都内联到726行:

^{pr2}$

第一种方法通过检查^{}的返回值,断言该对象确实是Unicode对象或其子类:

 #define PyUnicode_Check(op) \
             PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS)

第二个断言PyUnicode_AsUnicode(op)正确地设置了wstr成员。错误输出中的PyUnicode_Check(arg1)表明第一个错误在这里失败。在

现在有趣的是它不应该失败;PyObject_TypeCheck成功了,是一个Unicode对象(python3str),所以断言也应该是不可操作的

相关问题 更多 >