Подтвердить что ты не робот

ImportError: нет модуля с именем copy_reg pickle

Я пытаюсь раскрыть объект, сохраненный как blob в базе данных MySQL. Я вручную сгенерировал и сохранил маринованный объект в базе данных, но когда я пытаюсь раскрыть объект, я получаю следующее довольно загадочное исключение:

ImportError: нет модуля с именем copy_reg

Любые идеи относительно того, почему это происходит?

Метод размножения

Примечание. Необходимо выполнить шаг 1 на ПК с ОС Windows и шаги 3 и 4 на ПК с ОС Linux.

1) На ПК с ОС Windows:

file = open("test.txt", "w")
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)

2) Вручную вставьте содержимое text.txt в поле blob базы данных MySQL, работающей на linux

3) В Python, запущенном на машине linux, выберите содержимое столбца из MySQL

4) Предположим, что вы поместили содержимое столбца blob в переменную с именем data, попробуйте следующее:

cPickle.loads(rawString)
4b9b3361

Ответ 1

Кажется, это может быть вызвано моим методом экспорта маринованного объекта.

Этот отчет об ошибках показывает, что моя проблема может быть решена путем экспорта в файл, записанный в двоичный режим. Я собираюсь отдать это сейчас и посмотреть, решит ли это мою проблему.

UPDATE: Это работает. Решение состоит в том, чтобы убедиться, что вы экспортируете свой маринованный объект в файл, открытый в двоичном режиме, даже если вы используете протокол по умолчанию 0 (обычно называемый "текстом" )

Исправить код на основе соответствующего примера orignal:

file = open("test.txt", 'wb')
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)

Ответ 2

Кроме того, просто запустить dos2unix (под linux) над (созданным окном) файлом pickle решил проблему для меня. (Не пробовал использовать "wb" в открытом режиме.) Dan

Ответ 3

просто интерактивный сеанс python, чтобы показать, что вам не нужен какой-либо конкретный код для этой проблемы:

сделать что-то подобное на машине с Windows

Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle, re
>>> empty_string = re.compile("^$")
>>> pickle.dump([empty_string,1,1.23,'abc'], file('m:/mario/test-b.dump','wb'))
>>> pickle.dump([empty_string,1,1.23,'abc'], file('m:/mario/test-t.dump','wt'))
>>> 

а затем попытайтесь извлечь данные из окна linux

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> pickle.load(file('/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-b.dump'))
/usr/lib/python2.6/pickle.py:1124: DeprecationWarning: The sre module is deprecated, please import re.
  __import__(module)
[<_sre.SRE_Pattern object at 0xb7d42420>, 1, 1.23, 'abc']
>>> pickle.load(file('/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-t.dump'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/pickle.py", line 1370, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.6/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.6/pickle.py", line 1090, in load_global
    klass = self.find_class(module, name)
  File "/usr/lib/python2.6/pickle.py", line 1124, in find_class
    __import__(module)
ImportError: No module named sre
>>> 

сообщение об ошибке может быть еще более запутанным, если вы просто набираете базовые типы. это то, что я получаю со списком [12, 1.2, '']:

ValueError: insecure string pickle

Ответ 4

Еще одна вещь, которая здесь происходит, заключается в том, что вы, кажется, не закрыли файл после того, как сбросили на него марихуану. сообщаемая здесь ошибка иногда может быть вызвана (будь то на машине Windows или иначе), не закрывая файл.

Ответ 5

Как упоминалось в другом ответе, используйте

dos2unix originalPickle.file outputPickle.file

ИЛИ используйте команду tr, как показано ниже (удаляет возврат каретки и ctrl-z)

  tr -d '\15\32' < originalPickle.file > outputPickle.file

ИЛИ используйте awk (gawk или nawk, если его старые версии)

  awk '{ sub("\r$", ""); print }' originalPickle.file > outputPickle.file

ИЛИ, если вы можете воссоздать файл pickle в linux, используйте его.

Ответ 6

Нагрузка на рассол может не выглядеть в том же месте, что и ваш python script. Иногда каталог изменяется на основе вашего приложения. Перед загрузкой рассола напечатайте os.getcwd(), чтобы выработать решение.