【问题标题】:Error converting python-QRCode Module to Python 3将 python-QRCode 模块转换为 Python 3 时出错
【发布时间】:2012-12-14 15:59:54
【问题描述】:

下午好,这几天我尝试从运行在 Python3 下的 lincolnloop 获取 Python 二维码模块。它在 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): 

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

    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 码生成器。

谁能给我一个线索?提前致谢!

【问题讨论】:

  • 最好的地方可能是从docs.python.org/2/library/2to3.html 开始 - 并修复无法自动翻译的错误
  • 感谢您的回复。我研究了您今天早些时候提供的链接,但是自动 2to3 工具仅修复了我之前手动修复的“字符串,basestring”问题。 'TypeError: unsupported operand type(s) for %: bytes and str' 甚至没有出现。这就是我决定在 stackoverflow 上寻求帮助的原因。
  • 你能换个方式把data转换成字符串吗?你需要做data.decode(encoding) 其中encoding 是适当的编码(如'ascii')。抱歉,我没有浏览所有链接,所以也许这不是一个真正的解决方案。
  • Python 3 没有官方的PIL 版本(qrcode 依赖于处理图像的依赖项)。没有测试(如果你不想让它对其他人有用;不要在没有测试的情况下移植)。

标签: python regex python-3.x typeerror


【解决方案1】:

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

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

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

【讨论】:

  • 感谢大家帮助我。我不知道如何解决这些错误。我真的很想知道这个错误消息,因为我找不到关于这意味着什么的更多信息。 elif re.match(b'^[%s]*$' % re.escape(ALPHA_NUM), data): TypeError: unsupported operand type(s) for %: 'bytes' and 'bytes'我找到了另一个版本的 QR 生成器。它似乎是原始版本,Python-QRCode 是基于它的。但目前没有实现有效的图像处理。代码看起来非常相似,但有一些差异。这个不使用正则表达式。
  • 为了完整起见,这里是另一个链接:linkMichael
  • 谢谢!经过数小时的代码研究,我终于得到了一个运行 Python3 的 Python-QR 工作端口。
  • 我从 d-project.com 获取了原始图像,并使用 PIL 实现了一个有效的图像处理功能。目前我需要稍微清理一下代码,但在那之后我发布了它,所以每个人都可以在 Python3 中使用它。迈克尔
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2021-05-22
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多