2010-11-10 70 views
330

我有一個目錄,存儲所有的.py文件。如何在相同目錄或子目錄內導入類?

bin/ 
    main.py 
    user.py # where class User resides 
    dir.py # where class Dir resides 

我想用類從user.pydir.pymain.py
如何將這些Python類導入main.py
此外,如果user.py位於子目錄中,如何導入User類?

bin/ 
    dir.py 
    main.py 
    usr/ 
     user.py 
+0

參見回答了[Python的:從一個子目錄中導入文件(http://stackoverflow.com/questions/1260792/python-import-a-file-from-a -subdirectory)。 – Trilarion 2014-03-19 09:55:48

+2

http://www.diveintopython3.net/porting-code-to-python-3-with-2to3.html#import – 2014-12-17 12:51:14

+0

[我在這裏回答了類似的問題](http://stackoverflow.com/a/39152647/1911412 ) – kchoi 2016-08-25 23:33:09

回答

495

的Python 2

做一個空文件在同一目錄中的文件名爲__init__.py。這將意味着Python可以「從這個目錄導入」。

然後就去做...

from user import User 
from dir import Dir 

同樣如此,如果這些文件是在一個子目錄 - 把一個__init__.py在子目錄爲好,然後用普通的import語句,用點符號。對於每個級別的目錄,您需要添加到導入路徑。

bin/ 
    main.py 
    classes/ 
     user.py 
     dir.py 

所以如果目錄被命名爲 「類」,那麼你可以這樣做:

from classes.user import User 
from classes.dir import Dir 

的Python 3

與以前相同,但有一個.如果前綴模塊名稱不使用的子目錄:

from .user import User 
from .dir import Dir 
+0

是否需要'__init __。py'爲空。我想導入包'__init __。py'中的所有子模塊,例如爲目錄中的所有模塊(文件)添加行:'from Module1 impotr *'。可能嗎? – 2013-04-15 12:07:45

+8

如果'__init __。py'是* not * empty,那麼'__init __。py'中的任何東西都是導入包時可用的東西(並且沒有導入到__init __。py中的東西根本不可用)。 – Amber 2013-04-15 15:31:24

+8

爲什麼需要'__init __。py'文件?如果我將所有三個文件放在同一個目錄下並運行'main.py',就可以在沒有它的情況下從另外兩個模塊中'導入'。我錯過了什麼? – martineau 2013-09-18 13:55:53

2
from user import User 
from dir import Dir 
+4

它是'從X導入Y',而不'從Y導入Y'。 – Amber 2010-11-10 07:38:27

20

在你main.py

from user import Class 

其中Class是要導入的類的名稱。

如果你想調用的Class的方法,您可以使用調用它:

Class.method

注意,應該有一個空__init__.py文件在同一目錄下。

+0

如果你要導入的模塊沒有類,你會怎麼做?只是原始功能?在python 2中,我所要做的只是'導入模塊'。在python 3中不起作用,'import .module' – Frikster 2016-09-26 04:23:06

7

爲了更容易理解:

第1步:讓我們進入一個目錄,其中都將被列入

$ cd /var/tmp 

第2步:現在讓我們做一個class1的。其中有一個類名Class1的一些代碼

$ cat > class1.py <<\EOF 
class Class1: 
    OKBLUE = '\033[94m' 
    ENDC = '\033[0m' 
    OK = OKBLUE + "[OK]: " + ENDC 
EOF 

步驟3 PY文件:現在可以使具有類名稱的Class2一些代碼

$ cat > class2.py <<\EOF 
class Class2: 
    OKBLUE = '\033[94m' 
    ENDC = '\033[0m' 
    OK = OKBLUE + "[OK]: " + ENDC 
EOF$ touch main.py 

步驟4 class2.py文件:現在讓使一個main.py將被執行一次使用的Class1和等級2從2個不同的文件

$ cat main.py 
"""this is how we are actually calling class1.py and from that file loading Class1""" 
from class1 import Class1 
"""this is how we are actually calling class2.py and from that file loading Class2""" 
from class2 import Class2 

print Class1.OK 
print Class2.OK 

步驟5:蘋果咬

$ python main.py 
will now use class1 and class2 
+1

也不會發生,如果這不起作用並且main.py不能讀取class1或class2?會發生什麼? – darkgaze 2016-10-04 14:41:49

8

可以導入模塊,並有通過其名稱訪問,如果你不想與你混的函數和類

import util # imports util.py 

util.clean() 
util.setup(4) 

,或者你可以導入函數和類代碼

from util import clean, setup 
clean() 
setup(4) 

可以使用wildchar *導入模塊中的一切都在你的代碼

from util import * 
clean() 
setup(4) 
64

我只是樂arned(感謝martineau's comment),爲了同一個目錄內的文件導入類,你現在用Python語言編寫3:

from .user import User 
from .dir import Dir 
+4

剛切換到python3。謝謝!這個評論真的爲我節省了一些時間! – 2015-07-18 12:24:14

+2

如果我嘗試這不,我得到以下錯誤'ValueError異常:非package'但錯誤嘗試的相對進口消失時,我從用戶導入用戶來改變'' 我 – Korpel 2016-02-23 08:18:12

+0

從.fileloader進口Fileloader使用,並得到導入錯誤:不能進口名「Fileloader」 – Frikster 2016-09-26 04:22:03

2

太短暫, 創建一個文件__init__.py是classes目錄,然後輸入它給腳本像下面

from classes.myscript import *