2010-11-10 71 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 *