4

创建 reddit 对象时出现此错误。这是代码:

import praw, requests, ctypes
r = praw.Reddit(user_agent="Wallpaper downloader")

这是错误:

回溯(最近一次通话最后):

File "C:/Python27/background.py", line 3, in <module>
    r = praw.Reddit(user_agent="Wallpaper downloader")
  File "C:\Python27\lib\site-packages\praw\__init__.py", line 1028, in __init__
    super(AuthenticatedReddit, self).__init__(*args, **kwargs)
  File "C:\Python27\lib\site-packages\praw\__init__.py", line 502, in __init__
    super(OAuth2Reddit, self).__init__(*args, **kwargs)
  File "C:\Python27\lib\site-packages\praw\__init__.py", line 615, in __init__
    super(UnauthenticatedReddit, self).__init__(*args, **kwargs)
  File "C:\Python27\lib\site-packages\praw\__init__.py", line 280, in __init__
    self.handler = handler or DefaultHandler()
  File "C:\Python27\lib\site-packages\praw\handlers.py", line 70, in __init__
    self.http = Session()  # Each instance should have its own session
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 176, in __init__
    self.headers = default_headers()
  File "C:\Python27\lib\site-packages\requests\utils.py", line 461, in default_headers
    'User-Agent': default_user_agent(),
  File "C:\Python27\lib\site-packages\requests\utils.py", line 430, in default_user_agent
    _implementation = platform.python_implementation()
  File "C:\Python27\lib\platform.py", line 1458, in python_implementation
    return _sys_version()[0]
  File "C:\Python27\lib\platform.py", line 1423, in _sys_version
    repr(sys_version))
ValueError: failed to parse CPython sys.version: '2.7.3 |EPD_free 7.3-2 (32-bit)| (default, Apr 12 2012, 14:30:37) [MSC v.1500 32 bit (Intel)]'

我使用 pip 安装了 praw,并且我使用的是 Windows。知道为什么我会收到此错误吗?

4

3 回答 3

8

这看起来是环保署的一个错误。

这是怎么回事:

platform.py 在函数中尝试_sys_version(由 调用python_implementation,如您的堆栈跟踪所示),在某些情况下,sys.version使用正则表达式进行解析。在您的情况下,它认为您正在运行 CPython(是吗?CPython 是普通的 Python 版本,而不是 Jython 或 IronPython 之类的),这就是运行正则表达式的情况。正则表达式:

_sys_version_parser = re.compile(
    r'([\w.+]+)\s*'
    '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
    '\[([^\]]+)\]?')

以及运行它的代码:

else:
    # CPython
    match = _sys_version_parser.match(sys_version)
    if match is None:
        raise ValueError(
            'failed to parse CPython sys.version: %s' %
            repr(sys_version))
    version, buildno, builddate, buildtime, compiler = \
          match.groups()
    name = 'CPython'
    builddate = builddate + ' ' + buildtime

代码相当简单:它引发了错误,因为正则表达式不匹配。查看正则表达式:

r'([\w.+]+)\s*'
'\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
'\[([^\]]+)\]?')

第一部分,([\w.+]+)\s*匹配空格分隔的块[a-zA-Z0-9_.+]— 函数暗示这是版本号。这可能与“2.7.3”正确匹配。

第二部分更有趣。代码暗示它正在寻找 a buildno,而正则表达式似乎¹表明它正在寻找文字括号(()。我们稍后会在您的字符串中看到这一点:(default, Apr 12 2012, 14:30:37)

但这部分妨碍了:|EPD_free 7.3-2 (32-bit)|. 我的猜测是正则表达式没有预料到这一点,这就是导致它窒息的原因。

如何修复它:

在短期内,要测试这个理论,请尝试在 Python 中删除它。只需分配给sys.version,例如,

# This raises an exception for you:
platform.python_implementation()

# Try this:
sys.version = '2.7.3 (default, Apr 12 2012, 14:30:37) [MSC v.1500 32 bit (Intel)]'
# Hopefully, this no longer raises.
platform.python_implementation()

如果这确实解决了它,您可能希望长期摆脱它。我假设这是Enthought Python Distribution Free——你可能不得不在那里提交一个错误,因为这可能是他们已经做过的事情。

¹顺便说一句,这里有些奇怪。文字应该将这些反斜杠加倍,或者是原始字符串。(我相信,第一个文字中的 r 不会延续,但是,未知的转义最终会变成斜杠,所以它仍然有效。)

于 2013-09-30T23:14:41.210 回答
1

我一直在遇到同样的问题。我刚刚为它提交了一个错误修复

于 2013-12-18T23:10:01.063 回答
0

有同样的问题,通过将 PythonPath 更改为 Anaconda 安装来修复它(我以前安装了 Python)。

于 2016-02-24T11:41:39.120 回答