Как исправить Python ValueError: плохие данные маршала?
Запуск flexget Python script в Ubuntu, я получаю сообщение об ошибке:
$ flexget series forget "Orange is the new black" s03e01
Traceback (most recent call last):
File "/usr/local/bin/flexget", line 7, in <module>
from flexget import main
File "/usr/local/lib/python2.7/dist-packages/flexget/__init__.py", line 11, in <module>
from flexget.manager import Manager
File "/usr/local/lib/python2.7/dist-packages/flexget/manager.py", line 21, in <module>
from sqlalchemy.ext.declarative import declarative_base
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative/__init__.py", line 8, in <module>
from .api import declarative_base, synonym_for, comparable_using, \
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative/api.py", line 11, in <module>
from ...orm import synonym as _orm_synonym, \
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/__init__.py", line 17, in <module>
from .mapper import (
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 27, in <module>
from . import properties
ValueError: bad marshal data (unknown type code)
Ответы
Ответ 1
Если вы получите эту ошибку, скомпилированная версия модуля Python (файл .pyc), вероятно, повреждена. Gentoo Linux предоставляет python-updater
, но в Debian более простой способ исправить: просто удалите файл .pyc. Если вы не знаете pyc, просто удалите все из них (как root):
find /usr -name '*.pyc' -delete
Ответ 2
Просто удалите
/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/properties.pyc
он поврежден, как указывает текст. Вероятно, вам придется сделать это как root
.
После этого запуска (снова как root) запустите python (2.7):
/usr/bin/python -c "import sqlalchemy.orm.properties"
чтобы воссоздать этот файл .pyc
.
Если вы не воссоздаете файл .pyc
, ваша программа запускается медленнее, чем необходимо, поскольку файл .py
занимает больше времени, чем .pyc
(и обычный пользователь не может записать файл .pyc
).
Ответ 3
Также, похоже, произошла какая-то регрессия в setuptools с использованием Python 3.7. Смотрите пример - https://github.com/pypa/setuptools/issues/1257
Принудительная переустановка setuptools устранила эту проблему для меня.
sudo pip3 install --upgrade --force-reinstall setuptools
Ответ 4
Это может произойти, если у вас есть файлы Python 2.7.pyc, и вы пытаетесь загрузить их с помощью Python 3.5. В моем случае это был сторонний tarball, который ошибочно включал предварительно скомпилированные файлы Python 2.7.pyc вместе с исходным кодом.
Ответ 5
Я решил похожую ошибку, удалив и переустановив приложение Python, которое я использовал, и все зависимости с помощью диспетчера системных пакетов.
В моем случае я использовал awscli в Debian 9, и ошибка была "ValueError: неверные данные маршала (установить размер вне диапазона)".
Я побежал от имени root:
apt-get purge awscli
apt-get autoremove
apt-get install awscli
И тогда ошибка была исправлена.
Я мог бы представить случаи, когда сломанный пакет не удалялся (например, потому что он был помечен как установленный вручную или зависел от другого приложения, все еще установленного), в этих случаях это действие может не устранить ошибку. Однако я подумал, что должен попробовать этот способ, прежде чем вручную удалять файлы .pyc, установленные системой, и мне повезло.
Ответ 6
Я также получил эту проблему в среде Windows (Win 10).
Я исправил это, зайдя в Настройки и восстановив Python 3.7 с его установщиком. С тех пор все отлично работает.
Насколько я помню, я работал на сервере, когда мой компьютер переходил в спящий режим. Может быть, ущерб был нанесен в процессе гибернации как-то.