2017-04-06 65 views
0

我遇到了從文件導入所有方法的問題,以便我可以將它用作包。我有以下幾點:從Python包中導入方法

myapp.py 
mypackage/ 
mypackage/__init__.py 
mypackage/mypackage.py 

裏面的mypackage.py我有method1()method2()myapp.py裏面我想這樣做:

import mypackage 
mypackage.method1() 

但是這不起作用。相反,我需要做mypackage.mypackage.method1(),我不知道該怎麼做來解決這個問題。我發現的唯一方法是刪除__init__.py並將mypackage.py重命名爲__init__.py,這似乎不正確。

我需要在init文件中導入所有方法,因此我不必始終輸入包名兩次?

+1

爲什麼看起來不正確?如果'mypackage'中只有兩個方法,那麼爲什麼不在'__init __。py'中定義它們呢?甚至只需用'mypackage.py'替換目錄並將它們寫入;你不需要模塊的目錄開銷。或者,將它們導入到__init __。py中。 – jonrsharpe

+0

嗯,我有很多超過2這只是一個例子,在未來,我可能希望將它們分爲更多的文件組織。我的問題是如何將它們導入到'__init __。py'中,所以我不必指定單個文件名?我嘗試過。 import *'和'import mypackage',但沒有任何東西允許我執行'mypackage.method1()'。我同意沒有文件夾會更好,但pypi似乎不支持。 – Dendory

+0

'from .mypackage import *'?另外:*「未來我可能想要」*建議你應該閱讀YAGNI!從簡單的版本開始,然後在發現你的時候變得複雜*實際上需要*。 – jonrsharpe

回答

0

在您的示例中,該軟件包中包含一個mypackage程序包(__init__.py中的一個目錄)和一個mypackage模塊。當然,你剛剛發佈了一個稻草人例子,但如果你將一個模塊命名爲與你的軟件包相同的模塊,那麼你冒着導入錯誤的風險。並稱非包裝的東西「包」肯定是混亂!

要想從mypackage.py方法爲mypackage,您可以在mypackage/__init__.py做包相對進口:

from .mypackage import method1, method2 

...或

from .mypackage import * 

您應該重命名mypackage.py到別的原因是一個小錯誤就像丟失這個點導致錯誤的東西被導入。