Dateutil.parser.parse() дает ошибку "initial_value должен быть unicode или None, а не str" на платформе Windows

Я уверен, что есть действительно простое решение, но я все еще довольно новичок в Python.

Я пытаюсь использовать dateutil.parser.parse() для синтаксического анализа строки с меткой времени:

>>> import dateutil.parser
>>> a = dateutil.parser.parse("2011-10-01 12:00:00+01:00")
>>> print a
2011-10-01 12:00:00+01:00

Это отлично работает на моем Linux-сервере, но на моем тестовом поле Windows появляется сообщение об ошибке:

>>> import dateutil.parser
>>> a = dateutil.parser.parse("2011-10-01 12:00:00+01:00")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 698, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 302, in parse
    res = self._parse(timestr, **kwargs)
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 350, in _parse
    l = _timelex.split(timestr)
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 144, in split
    return list(cls(s))
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 44, in __init__
    instream = StringIO(instream)
TypeError: initial_value must be unicode or None, not str

Если я попытаюсь предоставить dateutil.parser.parse() строку unicode, которая не работает в окне Windows:

>>> a = dateutil.parser.parse(unicode("2011-10-01 12:00:00+01:00"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 698, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 302, in parse
    res = self._parse(timestr, **kwargs)
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 350, in _parse
    l = _timelex.split(timestr)
  File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 144, in split
    return list(cls(s))
TypeError: iter() returned non-iterator of type '_timelex'

Тем не менее это также работает в ящике Linux.

Ответ 1

Это не проблема Windows, проблема с версией/версией Python.

dateutil 2.0 написан для поддержки только Python 3, а не Python 2.X. Оба случая здесь содержат ошибки при использовании с Python 2.X.

В первом случае:

dateutil.parser.parse("2011-10-01 12:00:00+01:00")

класс io.StringIO допускает только аргументы в unicode, но код читает:

    if isinstance(instream, str):
        instream = StringIO(instream)

Во втором случае:

dateutil.parser.parse(unicode("2011-10-01 12:00:00+01:00"))

если вы посмотрите на класс _timelex, он содержит метод __next__, который является способом Python3, указывающим, что объект поддерживает протокол итерации. В Python 2.X имя метода должно быть next.

Проверьте, есть ли у вас одинаковые версии как Python, так и библиотеки в Linux и Windows. Из веб-сайт проекта:

python-dateutil-2.0.tar.gz(Python >= 3.0)

python-dateutil-1.5.tar.gz(Python < 3.0)