How to import the class within the same directory or sub directory?
我有一个存储所有.py文件的目录。
1 2 3 4
| bin/
main.py
user.py # where class User resides
dir.py # where class Dir resides |
我想在main.py中使用user.py和dir.py中的类。如何将这些python类导入main.py?此外,如果user.py在子目录中,如何导入类User?
1 2 3 4 5
| bin/
dir.py
main.py
usr/
user.py |
- 另请参见python中的答案:从子目录导入文件。
- 我在这里回答了类似的问题
Python 2
在与文件相同的目录中生成一个名为__init__.py的空文件。这意味着对python来说,"可以从这个目录导入"。
然后做…
1 2
| from user import User
from dir import Dir |
如果文件在子目录中,也同样如此——在子目录中也放置一个__init__.py,然后使用常规的import语句,使用点表示法。对于每一级目录,您需要添加到导入路径。
1 2 3 4 5
| bin/
main.py
classes/
user.py
dir.py |
因此,如果目录名为"classes",那么您可以这样做:
1 2
| from classes.user import User
from classes.dir import Dir |
Python 3
与前一个相同,但如果不使用子目录,则在模块名称前面加一个.:
1 2
| from .user import User
from .dir import Dir |
- 是否要求__init__.py为空?我想导入__init__.py包中的所有子模块,即为目录中的所有模块(文件)添加行:from Module1 impotr *。有可能吗?
- 如果__init__.py不是空的,那么__init__.py中的任何内容都是在导入包时可用的(而没有导入__init__.py的内容根本不可用)。
- 为什么需要一个__init__.py文件?如果我把这三个文件放在同一个目录下,运行main.py,它就可以从其他两个模块中运行import,不用它也可以。我错过了什么?
- 因为这就是python标识允许导入的目录的方式。您正在运行的脚本的目录是一个例外,您总是可以从中导入。
- 对不起,Amber,我把一个空的__init__.py文件放在我的2个子目录(gui/和logic/)中,但我仍然有ImportError: No module named 'player'的导入问题,这个player.py在logic/中,正如我告诉你的,这里有__init__.py文件。有什么问题?
- @nbro&;amber:fwiw,我认为与__init__.py相关的一些细微变化,能够在同一目录中导入其他模块。具体来说,与在python 2.7.8中工作的__init__.py文件本身所在目录中的其他模块的imports在python 3.4.1中失败。为了解决这个问题,我必须在每个目录前面加上子目录的名称和一个点(即import module必须改为import subdirectory.module)。幸运的是,这样做之后,它仍然可以在Python2.7.8中工作。
- @Martineau正是如此,它是一种更面向对象的模块导入方式。
- @NBO:由于其他模块与__init__.py在同一目录中,并且它以前不用前缀就可以工作,所以我认为这是一个bug……可能是由于在python 2.x到3.x之间发生了一些与模块和包导入有关的意外结果。
- 我认为这个解决方案不适用于python 3
- 我可以确认这个解决方案不再有效。您可能希望更正、修改或直接删除它。
- 我同样也不认为这在Python3中有效。我认为这是因为我的模块只包含函数,没有类。
- 啊,是的,我解决了。用途:从。如果模块没有类,则导入文件加载器
- 你要做什么?你的in it.py文件里有东西?我试着从同一个文件夹导入,但找不到它。如果我在init.py上导入这两个文件,它会工作…但如果你试图从其他任何地方进口
- @如果__init__.py文件不是空的,那么模块将只包含__init__.py文件中定义的内容。因此,您的__init__.py需要从本地目录导入您希望其他文件能够从模块导入的任何内容。(空的__init__.py意味着只隐式引用目录的其余部分。)
- @琥珀行。但我该怎么做呢?做进口?这些进口产品应该怎样?导入childname?还是导入thisname.childname?.如何从每个子模块中导入子模块?也导入childname?
- 顺便说一下,我发现:python.org/dev/peps/pep-0328/id8 pep 328专门讨论了相关的进口。
- 这个答案的前几行很糟糕,根本不起作用。关于这里的工作答案:stackoverflow.com/a/41276151/129202
我刚刚了解到(感谢Martineau的评论),为了从同一目录中的文件导入类,您现在可以用python 3编写:
1 2
| from .user import User
from .dir import Dir |
- 刚换了三号Python。谢谢!这个评论真的节省了我一些时间!
- 如果我尝试这个否,我会得到以下错误ValueError: Attempted relative import in non-package,但是当我改为from user import User 时,错误会消失。
- 我使用from.fileloader import fileloader和get importError:无法导入名称"fileloader"
- @Korpel:在stackoverflow.com/questions/11536764/…中的讨论之后,我逐渐意识到,上面给出的导入是否有效取决于以下因素:(1)如何调用脚本(是否为包)[2]执行时实际工作路径在何处[3]如何填充运行环境的路径变量
- @Dirk Haupt:见以上评论
在您的main.py中:
其中,Class是要导入的类的名称。
如果要调用Class的方法,可以使用以下方法调用它:
Class.method
注意,同一目录中应该有一个空的__init__.py文件。
- 如果要导入的模块没有类,该怎么办?只是原始函数?在Python2中,我所要做的就是"导入模块"。不能在python 3中使用,也不能使用"import.module"
如果不想将函数和类与您的混合,可以导入模块并通过其名称进行访问。
1 2 3 4
| import util # imports util.py
util.clean()
util.setup(4) |
或者可以将函数和类导入到代码中
1 2 3
| from util import clean, setup
clean()
setup(4) |
可以使用wildchar*将该模块中的所有内容导入到代码中
1 2 3
| from util import *
clean()
setup(4) |
为了使理解更简单:
步骤1:让我们转到一个目录,所有目录都将包含在其中
第2步:现在让我们制作一个class1.py文件,它有一个类名class1和一些代码
1 2 3 4 5 6
| $ cat > class1.py <<\EOF
class Class1:
OKBLUE = '\033[94m'
ENDC = '\033[0m'
OK = OKBLUE +"[Class1 OK]:" + ENDC
EOF |
第3步:现在让我们制作一个class2.py文件,它有一个类名class2和一些代码
1 2 3 4 5 6
| $ cat > class2.py <<\EOF
class Class2:
OKBLUE = '\033[94m'
ENDC = '\033[0m'
OK = OKBLUE +"[Class2 OK]:" + ENDC
EOF |
步骤4:现在让我们制作一个main.py,它将在两个不同的文件中使用Class1和Class2执行一次。
1 2 3 4 5 6 7 8 9
| $ cat > main.py <<\EOF
"""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
EOF |
第5步:运行程序
输出将是
1 2
| [Class1 OK]:
[Class2 OK]: |
- 如果这不起作用,而且main.py不能读取Class1或Class2,会发生什么?…我们遗漏了什么?
1 2
| from user import User
from dir import Dir |
- 是from X import Y,不是import Y from X。
- 这对我来说很有效,没有python 2.7和python 3.6的init.py文件。
- @imsrgadich只要您在包含文件的目录中运行python,它就可以工作。这是一个例外。查看此评论
Python 3
同directory。
导入文件:log.py。
进口类别:SampleApp()。
1 2 3 4
| import log
if __name__ =="__main__":
app = log.SampleApp()
app.mainloop() |
或
目录是basic。
档案导入:log.py。
进口类别:SampleApp()。
1 2 3 4
| from basic import log
if __name__ =="__main__":
app = log.SampleApp()
app.mainloop() |
只是太短暂了,创建一个文件__init__.pyis classes目录,然后将其导入到脚本中,如下所示
1
| from classes.myscript import * |
- 在这个答案中看到的通配符导入通常被认为是PEP8中描述的坏样式。
- 麻烦你是对的,但你为什么不投一个老问题的票?