1

下午好,几天来我尝试从 lincolnloop 获取 Python QR-Code 模块,在 Python3 下运行。它在 Python 2.x 上完美运行。- https://github.com/lincolnloop/python-qrcode

一般来说,我对 Python 编程非常陌生,但我认为到目前为止我已经完成了我的作业。

第一个错误:

 File "/usr/lib/python3.2/qrcode/util.py", line 274, in __init__

    if not isinstance(data, basestring):
NameError: global name 'basestring' is not defined

所以在 Python3 中不再存在 basestring,我用这里找到的这个代码语句来解决这个问题。- https://github.com/oxplot/fysom/issues/1

try:
    unicode = unicode
except NameError:
    # 'unicode' is undefined, must be Python 3
    str = str
    unicode = str
    bytes = bytes
    basestring = (str,bytes)
else:
    # 'unicode' exists, must be Python 2
    str = str
    unicode = unicode
    bytes = str
    basestring = basestring

所以下一个错误出现了。

  File "/usr/lib/python3.2/qrcode/util.py", line 285, in __init__
    elif re.match('^[%s]*$' % re.escape(ALPHA_NUM), data):
  File "/usr/lib/python3.2/re.py", line 153, in match
    return _compile(pattern, flags).match(string)
TypeError: can't use a string pattern on a bytes-like object

所以我尝试在这里找到的解决方案 - Python TypeError on regex并更改以下代码:

elif re.match('^[%s]*$' % re.escape(ALPHA_NUM), data):

至:

elif re.match(b'^[%s]*$' % re.escape(ALPHA_NUM), data): 

以二进制模式处理 RegEx。但这会在同一行代码中引发下一个执行。

    elif re.match(b'^[%s]*$' % re.escape(ALPHA_NUM), data):
TypeError: unsupported operand type(s) for %: 'bytes' and 'str'

我也尝试改变

ALPHA_NUM = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'

ALPHA_NUM = b'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'

但这不会改变 Execption。

所以这对我来说表明了与以前相同的错误,并且代码中的任何地方都必须是这种类型的错误,无论是字节还是字符串类型。但我找不到它。

我知道整个脚本对于深入研究 python 是非常复杂的,但是对于我的项目,我需要一个有效的 QR 码生成器。

有人可以给我一个线索吗?提前致谢!

4

1 回答 1

0

您不能将 % 运算符用于bytes对象。您现在处理的数据是真正的二进制数据,还是文本?如果是文本,你应该把它当作字符串来处理,而不是字节。

此外,与模块的作者交谈。他们可能已经完成了大部分移植工作,或者他们可能愿意提供帮助。第三,阅读有关该主题的免费书籍python3porting.com 。

处理 Unicode 和字节数据移植的困难部分。您必须确保始终使用其中一种,而要正确使用通常会很痛苦。

于 2012-12-29T21:42:09.483 回答