[英]More on python ImportError No module named
根據這里的建議,我的包(或包含我的模塊的目錄)位於C:/ Python34 / Lib / site-packages。 該目錄包含__init__.py
, sys.path
包含目錄的路徑,如圖所示。
我仍然收到以下錯誤:
Traceback (most recent call last):
File "C:/Python34/Lib/site-packages/toolkit/window.py", line 6, in <module>
from catalogmaker import Catalog
File "C:\Python34\Lib\site-packages\toolkit\catalogmaker.py", line 1, in <module>
from patronmaker import Patron
File "C:\Python34\Lib\site-packages\toolkit\patronmaker.py", line 4, in <module>
class Patron:
File "C:\Python34\Lib\site-packages\toolkit\patronmaker.py", line 11, in Patron
patrons = pickle.load(f)
ImportError: No module named 'Patron'
我在patronmaker.py中有一個名為'Patron'但沒有名為Patron的模塊,所以我不確定錯誤信息中的最后一個語句是什么意思。 我非常感謝你對我失蹤的想法。
Windows 32位計算機上的Python 3.4.1版 。
您將所有patron實例(即self
)保存到Patron
類屬性Patron.patrons
。 然后你試圖從類中挑選一個類屬性。 這可以扼殺pickle
,但我相信dill
應該能夠處理它。 是否真的有必要將所有類實例保存到Patrons中的列表中? 這有點奇怪......
pickle
通過引用序列化類,並且對於許多對象而言不適合__main__
。 在dill
,您不必通過引用序列化類,它可以更好地處理__main__
問題。 在這里獲取dill
: https : //github.com/uqfoundation
編輯:我嘗試了你的代碼(只有一個小的改動),它工作。
dude@hilbert>$ python patronmaker.py
然后啟動python ......
>>> import dill
>>> f = open('patrons.pkl', 'rb')
>>> p = dill.load(f)
>>> p
[Julius Caeser, Kunte Kinta, Norton Henrich, Mother Teresa]
我做的唯一改變是在patronmaker.py
結束時取消注釋,以便它節省了一些顧客....... 而且我還用import dill as pickle
取代import pickle
import dill as pickle
到處都是。
因此,即使下載並運行您的代碼,我也不能用dill
產生錯誤。 我正在使用github的最新dill
。
附加編輯:上面的回溯來自ImportError
。 你安裝了模塊嗎? 如果您沒有使用setup.py進行安裝,或者您的PYTHONPATH
上沒有模塊,那么無論您如何序列化,都無法找到模塊。
更多編輯:看看你的代碼,你應該為patrons
使用單身模式 ......它不應該在class Patron
。 類級別的代碼塊將顧客加載到Patron.patrons
肯定會引起問題......並且可能必然會成為某種形式的錯誤的根源。 我也看到你酸洗屬性Patrons.patrons
從內部(甚至不是類本身) Patrons
類- 這太瘋狂了 -不這樣做。 另請注意,當您嘗試獲取顧客時,您使用Patron.patrons
...這是調用類對象而不是實例。 將顧客移到課堂外,並直接使用單身人士作為顧客列表。 另外你通常應該使用顧客實例,所以如果你想讓每個顧客都知道所有其他顧客是誰, p = Patron('Joe', 'Blow')
,然后p.patrons
來獲得所有顧客......但是你我需要編寫一個Patrons.load
方法來讀取單個顧客列表...你也可以使用一個property
來使load
給你一些看起來像屬性的東西。
如果您構建一個單獨的顧客(作為列表)...或者顧客的“注冊表”(作為dict),如果您願意,那么只需檢查是否存在顧客pickle文件...加載到注冊表...並且不要做它來自Patrons課程......事情應該會好得多。 您的代碼當前正在嘗試在構建該類對象時在類定義上加載類實例。 那很糟...
此外,當您沒有提供最小的測試用例或有關如何創建回溯的足夠信息時,不要指望人們下載您的代碼並為您調試它。 對於某些暗角情況,您可能在dill
遇到了有效的酸洗錯誤,但我無法告訴b / c我無法重現您的錯誤。 但是,我可以說你需要一些重構。
而且要明確:
將您的顧客從patrons.py
初始化混亂轉移到新文件patrons.py
import os
import dill as pickle
#Initialize patrons with saved pickle data
if os.path.isfile('patrons.pkl'):
with open("patrons.pkl", 'rb') as f:
patrons = pickle.load(f)
else: patrons = []
然后在patronmaker.py和其他地方你需要單身...
import dill as pickle
import os.path
import patrons as the
class Patron:
def __init__(self, lname, fname):
self.lname = lname.title()
self.fname = fname.title()
self.terrCheckedOutHistory = {}
#Add any created Patron to patrons list
the.patrons.append(self)
#Preserve this person via pickle
with open('patrons.pkl', 'wb') as f:
pickle.dump(the.patrons, f)
你應該沒問題,除非你的代碼遇到一種情況,模塊上的屬性無法被序列化,因為它們是動態添加的(參見https://github.com/uqfoundation/dill/pull/47 ),這應該是肯定的使pickle
失敗,在某些情況下也會dill
...可能在模塊上有AtrributeError
。 我只是無法重現這一點......我已經完成了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.