ImportError: нет модуля с именем copy_reg pickle - PullRequest
20 голосов
/ 17 февраля 2009

Я пытаюсь распаковать объект, хранящийся в виде 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)

Ответы [ 8 ]

23 голосов
/ 17 февраля 2009

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

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

ОБНОВЛЕНИЕ: Это работает. Решение состоит в том, чтобы убедиться, что вы экспортировали свой засоленный объект в файл, открытый в двоичном режиме, даже если вы используете протокол по умолчанию 0 (обычно называемый «текст»)

Правильный код, основанный на рассматриваемом оригинальном примере:

file = open("test.txt", 'wb')
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)
15 голосов
/ 17 апреля 2009

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

3 голосов
/ 07 августа 2009

просто интерактивный сеанс 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
1 голос
/ 28 августа 2018

мой номер:

with open('model.pkl', 'rb') as f:
    subsection_struct_model = pickle.load(f)

когда я получаю model.pkl из windows, запускаю этот код на моем mac, эта проблема уже наступила

решить:

dos2unix model.pkl 

в порядке!

1 голос
/ 30 октября 2015

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

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, используйте это.

1 голос
/ 19 октября 2014

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

0 голосов
/ 27 декабря 2018

Это происходит из-за того, что в Windows символ новой строки хранится как "\ r \ n", а в Linux - "\ n", поэтому вам нужно прочитать строку для файла pickle построчно, заменить "\ r \ n "с помощью" \ n "и запишите его обратно в файл.

В отличие от подхода dos2unix пропустить двоичный файл, это также хорошо работает для двоичного файла рассылки.

Код прост:

#run this code on Linux platform

DIR="your/dir/to/file"

pickle.load(open(DIR,"rb"))
# ImportError: No module named copy_reg pickle

a=open(DIR,"rb").readlines() #read pickle file line by line

a=map(lambda x:x.replace("\r\n","\n"),a) # replace \r\n with \n

with open(DIR,"wb") as j: #write back to file in binary mode
    for i in a:
        j.write(i)         
pickle.load(open(DIR,"rb")) 
#Now it works well

Кроме того, вы можете использовать обычный режим записи, просто измените «wb» на «w» и «rb» на «e».

0 голосов
/ 16 февраля 2016

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

...