2017-08-16 21 views
7

Tôi đang sử dụng Python 3.6 và đang cố gắng làm theo ví dụ đầu tiên tại trang web bên dưới (mã đầy đủ bên dưới) và đang nhận lỗi dưới đây: thông điệp https://docs.python.org/3.6/library/multiprocessing.htmlLỗi đa xử lý Python: AttributeError: module '__main__' không có thuộc tính '__spec__'

lỗi: AttributeError: module '__main__' has no attribute '__spec__'

mã ví dụ đầy đủ:

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    with Pool(5) as p: 
     print(p.map(f, [1, 2, 3])) 

tôi thử Googling nó và tìm kiếm stack Overflo nhưng tôi chỉ tìm thấy một trường hợp khác của lỗi này và nó không có câu trả lời.

+0

Mã đã đăng hoạt động tốt trên máy của tôi – bendl

+0

Tôi đang sử dụng Anaconda/Spyder với Python 3.6 ... có thể có liên quan gì đến nó? – user8474060

+0

Tôi đang sử dụng Spyder 3.1.2 với Python 3.6.0 (Anaconda 4.3.1) trong Windows 7 – bendl

Trả lời

13

Vấn đề không phải với mã/Python 3.6, đó là với Spyder.

Sau khi điều tra, tôi thấy rằng mã chạy tốt khi được thực hiện trong một thiết bị đầu cuối hệ thống bên ngoài nhưng không chạy khi chạy trong giao diện điều khiển IPython của Spyder.

tôi đã có thể để đổ nội dung của đặc tả và gán chúng cho một biến mà đã được bao gồm trong chính để cho phép mã này vào hoạt động trong IPython console.

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    __spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)" 
    with Pool(5) as p: 
     print (p.map(f, [1, 2, 3])) 
+6

Tôi thực sự ngạc nhiên khi làm việc, vì '__spec__' không phải là một chuỗi bình thường. Vì nó đã làm việc, bạn có thể chỉ cần sử dụng 'None'. – Kevin

+0

Tôi đã thử '__spec__ = __spec__' và quá trình con bắt đầu và dừng lại vô hạn. Tôi cũng đã kiểm tra biến '__spec__' khi kịch bản được khởi động trong thiết bị đầu cuối hệ thống. Đó là 'Không có'. Vì vậy, tôi nghĩ rằng '__spec__ = None' là cách" đúng "để sửa lỗi này. – Winand

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