簡體   English   中英

有關python的更多信息ImportError沒有命名的模塊

[英]More on python ImportError No module named

根據這里的建議,我的包(或包含我的模塊的目錄)位於C:/ Python34 / Lib / site-packages。 該目錄包含__init__.pysys.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__問題。 在這里獲取dillhttps//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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM