Praw "не удалось разобрать CPython sys.version" при создании объекта Reddit

Я получаю эту ошибку при создании объекта Reddit. Вот код:

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

Вот ошибка:

Traceback (последний вызов был последним):

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)]'

Я установил praw с помощью pip, и я использую Windows. Есть идеи, почему я получил эту ошибку?

3 ответа

Решение

Это выглядит как ошибка в EPD.

В чем дело:

попытки 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" правильно.

Вторая часть намного интереснее. Код намекает на то, что он ищет 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 из первого литерала не переносится, однако неизвестный побег заканчивается слэшем - что угодно, так что он все еще работает.)

Я испытывал ту же проблему. Я только что представил исправление ошибки.

Была та же проблема, исправлена ​​путем изменения PythonPath на установку Anaconda (у меня была предыдущая установка Python).

Другие вопросы по тегам