2009-02-17 26 views
18

Tôi đang cố gắng bỏ chọn một đối tượng được lưu trữ dưới dạng blob trong cơ sở dữ liệu MySQL. Tôi đã tự tạo ra và lưu trữ các đối tượng ngâm trong cơ sở dữ liệu, nhưng khi tôi cố gắng unpickle đối tượng, tôi nhận được ngoại lệ chứ không phải khó hiểu như sau:ImportError: Không có mô-đun nào được đặt tên là copy_reg pickle

ImportError: Không có mô-đun tên copy_reg

Bất kỳ ý tưởng là tại sao điều này xảy ra?

Phương pháp sinh sản

Lưu ý: Phải thực hiện bước 1 trên một máy tính Windows và các bước 3 và 4 trên một máy tính Linux.

1) Trên một máy tính Windows:

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

2) Chèn nội dung của text.txt vào lĩnh vực blob của cơ sở dữ liệu MySQL chạy trên linux

3) Trong Python chạy trên một máy Linux, lấy nội dung của cột từ MySQL

4) Giả sử rằng bạn đặt các nội dung của cột blob thành một biến gọi là dữ liệu, hãy thử này:

cPickle.loads(rawString) 
+0

bạn đang sử dụng phiên bản python nào? – SilentGhost

+0

Điều này xảy ra với Python 2.4 –

+0

Mã nào sẽ thêm vào trong trường hợp này? –

Trả lời

23

Dường như điều này có thể là do phương pháp xuất khẩu đối tượng bị ngâm của tôi.

This bug report seens để đề xuất rằng sự cố của tôi có thể được giải quyết bằng cách xuất sang tệp được viết ở chế độ nhị phân. Tôi sẽ cung cấp cho điều này một đi ngay bây giờ và xem nếu điều này giải quyết vấn đề của tôi.

CẬP NHẬT: Tính năng này hoạt động. Giải pháp là đảm bảo bạn xuất đối tượng đã chọn của mình sang tệp mở ở chế độ nhị phân, ngay cả khi bạn đang sử dụng giao thức mặc định 0 (thường được gọi là "văn bản")

Mã đúng dựa trên ví dụ orignal được đề cập :

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

Một lần nữa, mã chính xác sẽ hiển thị những gì? Làm thế nào nó sẽ được benifit cho câu trả lời này? –

+0

Nếu chỉ muốn đề cập đến rằng 'Không có mô-đun tên copy_reg pickle' cũng có thể được bất kỳ tên mô-đun khác như trong trường hợp của tôi. Điều này có thể gây nhầm lẫn trong khi gỡ lỗi. – holzkohlengrill

12

Ngoài ra, chỉ cần chạy dos2unix (dưới linux) qua tệp chọn (cửa sổ tạo) đã giải quyết được sự cố cho tôi. (Đã không cố gắng chế độ mở điều 'wb'.) Dan

3

chỉ là một phiên python tương tác để chứng minh rằng bạn không cần bất kỳ mã đặc biệt có vấn đề này:

làm điều gì đó như về vấn đề này một máy cửa sổ

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')) 
>>> 

và sau đó cố gắng để lấy dữ liệu từ một hộp 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 
>>> 

được thông báo lỗi có thể khó hiểu hơn nếu quý khách chỉ là các loại cơ sở ngâm. đây là những gì tôi nhận được với danh sách [12, 1.2, '']:

ValueError: insecure string pickle 
1

Một điều xảy ra ở đây là bạn không có vẻ đã đóng tập tin sau khi bán phá giá dưa với nó. các lỗi báo cáo ở đây đôi khi có thể được gây ra (cho dù trên một cửa sổ máy hoặc bằng cách khác) bằng cách không đóng tập tin.

0

Như đã đề cập trong câu trả lời khác sử dụng

dos2unix originalPickle.file outputPickle.file 

HOẶC sử dụng lệnh tr như dưới đây (loại bỏ kí tự xuống dòng và ctrl-z)

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

OR dùng awk (gawk hoặc nawk nếu nó phiên bản cũ)

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

O R nếu bạn có thể tạo lại một tập tin dưa trong Linux, hãy sử dụng nó.

0

Tải trọng có thể không tìm ở cùng vị trí với tập lệnh python của bạn. Đôi khi thư mục thay đổi trên cơ sở ứng dụng của bạn. Ngay trước khi bạn tải dưa chua, hãy in một os.getcwd() để tìm ra giải pháp.

Các vấn đề liên quan