Ошибка "ValueError: _type_ 'v' не поддерживается" после установки PyReadline

После того, как я установил PyReadline, IPython не будет работать. Когда я его удалил, он снова начинает работать.

Трассировка стека для ipython:

(py2.7_monitor)[root@vm10-136-8-98 monitor]# ipython
WARNING: IPython History requires SQLite, your history will not be saved
Traceback (most recent call last):
  File "/home/py2.7_monitor/bin/ipython", line 11, in <module>
    sys.exit(start_ipython())
  File "/home/py2.7_monitor/lib/python2.7/site-packages/IPython/__init__.py", line 118, in start_ipython
    return launch_new_instance(argv=argv, **kwargs)
  File "/home/py2.7_monitor/lib/python2.7/site-packages/traitlets/config/application.py", line 591, in launch_instance
    app.initialize(argv)
  File "<string>", line 2, in initialize
  File "/home/py2.7_monitor/lib/python2.7/site-packages/traitlets/config/application.py", line 75, in catch_config_error
    return method(app, *args, **kwargs)
  File "/home/py2.7_monitor/lib/python2.7/site-packages/IPython/terminal/ipapp.py", line 314, in initialize
    self.init_shell()
  File "/home/py2.7_monitor/lib/python2.7/site-packages/IPython/terminal/ipapp.py", line 330, in init_shell
    ipython_dir=self.ipython_dir, user_ns=self.user_ns)
  File "/home/py2.7_monitor/lib/python2.7/site-packages/traitlets/config/configurable.py", line 380, in instance
    inst = cls(*args, **kwargs)
  File "/home/py2.7_monitor/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 531, in __init__
    self.init_readline()
  File "/home/py2.7_monitor/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 1941, in init_readline
    import IPython.utils.rlineimpl as readline
  File "/home/py2.7_monitor/lib/python2.7/site-packages/IPython/utils/rlineimpl.py", line 21, in <module>
    _rl = __import__(_rlmod_name)
  File "/home/py2.7_monitor/lib/python2.7/site-packages/readline.py", line 6, in <module>
    from pyreadline.rlmain import Readline
  File "/home/py2.7_monitor/lib/python2.7/site-packages/pyreadline/__init__.py", line 12, in <module>
    from . import logger, clipboard, lineeditor, modes, console
  File "/home/py2.7_monitor/lib/python2.7/site-packages/pyreadline/clipboard/__init__.py", line 13, in <module>
    from .win32_clipboard import GetClipboardText, SetClipboardText
  File "/home/py2.7_monitor/lib/python2.7/site-packages/pyreadline/clipboard/win32_clipboard.py", line 37, in <module>
    import ctypes.wintypes as wintypes
  File "/usr/local/lib/python2.7/ctypes/wintypes.py", line 23, in <module>
    class VARIANT_BOOL(_SimpleCData):
ValueError: _type_ 'v' not supported

1 ответ

Решение

Как указано на их сайте, PyReadline Используется библиотека для Windows.

Глядя на последние строки трассировки стека:

import ctypes.wintypes as wintypes
File "/usr/local/lib/python2.7/ctypes/wintypes.py", line 23, in <module>
class VARIANT_BOOL(_SimpleCData):
ValueError: _type_ 'v' not supported

Он пытается импортировать конкретные типы данных Windows из ctypes что, очевидно, невозможно, так как вы не используете Windows.

Скорее всего, это точно никому не поможет в 2020 году или позже, но все же я хочу записать это здесь для потомков.

Я испытал то же самое ValueError: _type_ 'v' not supportedтрассировка с установкой Python 2.7.16 в кластерной среде HPC, при попытке установить pdbpp, который зависит от fancycompleter, который зависит от pyreadline, который импортируетctypes.wintypesи затронута этой основной проблемой Python с 2012 года.

Это правда что ctypes.wintypesникогда не должны импортироваться на платформу, отличную от Windows (Cygwin, MSYS2 и Git Bash технически не относятся к Windows, поскольку они будут иметь настоящую библиотеку GNU Readline и им не понадобится чистая оболочка Python).

Однако, если он был импортирован на платформу, отличную от Windows, из-за проблемы, упомянутой выше,ctypes.wintypes бросает ValueError вместо ImportError, что означает, что типичный try/except который рассчитывает поймать ImportError просто взорвется из-за необработанного исключения.

Fancycompleter, или, скорее, pyreadline, каким-то образом стал жертвой этого. Я не понимаю, кто виноват, потому что fancycompleter'ssetup.pyне должен вводить pyreadline в качестве зависимости, кроме как в Windows, но каким-то образом это было в моей системе Linux. И если он там, fancycompleter пытается его импортировать.

Все, что я могу понять, это то, что у меня в кеше pip был старый fancycompleter с опечаткой в setup.pyчто тянул в pyreadline, когда он не должен иметь, потому что это был захват, что зависимость, время от времени.

Что на самом деле окончательно разрешило эту ситуацию для меня, так это pip uninstall pyreadline, тогда pip install -U --ignore-installed --no-cache-dir fancycompleter чтобы получить "свежую" версию fancycompleter, которая не привносит ненужную зависимость pyreadline.

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