2011-12-03 69 views
4

更具體,讓我們說,我有很多的.py文件,與main.py進口的東西像操作系統,pygame的,數學和我的所有其他.py文件,mymodule01.py等。導入Python模塊用在只有一個文件

我的問題是,每當main.py呼籲我的.py文件之一,該文件包含有類似的os.listdir()我不斷收到一個錯誤說東西像「OS沒有定義」。

如果我只是導入每個.py文件我寫的所有需要​​的模塊,或者是有更好的方法,這樣每個文件可以識別一個集中的進口?尤其是對於pygame來說,這將會非常令人困惑,因爲我不得不在每個文件中初始化pygame來使用它的功能,更不用說我是否想要在屏幕上顯示某些東西。

的Python模塊和包文檔中沒有太大的幫助,那還是我真的很慢,還考慮到以下的文檔後,我不斷添加例如後得到一個未找到錯誤在包含文件夾中的init .py文件中導入mymodule01.py。

+1

+1當之無愧的問題要好得多系統。爲了放大所選答案中的一個點,可以認爲「import」可以訪問另一個名稱空間;它加載代碼(每個解釋器只有一次)可以被認爲是一種副作用。 – msw

回答

4

如果我只是導入所有需要的模塊中的每個.py文件我寫

是。

有了pygame的特別,這將是非常令人困惑,因爲我必須初始化pygame的每個文件只是爲了使用它的功能

沒有,只有初始化一次。只有一個模塊副本。

+0

所以我假設當我想blit一個表面時,我必須在模塊中執行此操作,在其中我啓動了pygame,並且無論我在其他某個模塊中使用哪個表面,都必須將它們傳遞給init模塊? – user1079328

+0

完全沒有;所有的小模塊共享相同的'pygame'模塊,並且它在哪裏被初始化並不重要。您只需要在每個使用它的模塊中將其導入到本地模塊名稱「pygame」。一旦初始化完成,其他任何使用pygame的應用都可以在任何發生調用的地方正常工作(儘管您可能想要考慮MVC-ish設計)。 – geoffspear

+0

謝謝,這並不像我擔心的那麼糟糕。 – user1079328

4

我想你可能會覺得「導入」就像其他語言中的「包含」一樣。它沒有。

每個模塊對象是一個單例。沒有性能下降或不止一次初始化模塊代碼的危險。

此外,每個文件都有其自己的範圍,因此在您的示例中,如果您在main.py中定義foo = 1,將不會在mymodule01.py中可見。你將不得不import main; main.foo看到它(不是說你應該)

你發牢騷,但是這是一個比include

+0

我非常肯定,我用錯誤的思維方式接近了這一點,並且確實有這樣的模糊印象,即導入相當於每次調用時初始化模塊代碼。謝謝你清理那個。 – user1079328