python3在导入不同目录的模块时是怎么做的
先来看一下我们的Project目录
|---myproject ├── __init__.py ├── settings.py ├── folderA │ └── testA.py ├── folderB │ ├── __init__.py │ ├── testB.py ├── test.py
在相同目录下
我们现在在myproject/目录下
在同一目录下,我们可以使用'.'来表示当前目录:
from . import test.py
或者直接import
import test.py
如果你想使用同目录下某一文件的内容,假设我们test.py内有一对象名为app
from .test import app
在上级目录中
我们现在在folderA下
对于调用上级目录的内容,我们可以使用'..'来表示返回上一级目录,假设我们现在要调用上一层的test. py
from .. import test.py
如果你想使用上级目录下某一文件的内容,假设我们test.py内有一对象名为app
from ..test import app
在兄弟目录中
现在我们仍然在folderA下
我们可以看到,folderB是和folderA一样在myproject下面的目录,我们该怎么办呢?先返回上级目录调用,调用方法类似于上级目录下的某一文件.我们现在要调用folderB下的testB.py
from ..folderB import testB
__init__.py是什么
当一个目录下有__init__.py时,python将该目录认定为package。我们可以看到myproject/下面有一个init.py,这个时候myproject可以被当做package.
import myproject
而如果没有init.py的话,myproject只是文件夹,不可以被调用。init.py通常为空,但是也可以放从其他文件import 一些参数,假设我们的init.py引入了test.py的app
from .test import app
之后我们就可以直接通过包名来调用它
from myproject import app
从顶层调用及子目录调用
我们可以使用'.'或者'..'来调用同一级或上一级的模块和对象,但是如果你想跨过多层调用(上上级目录),你需要从顶层调用,我们当前的根目录是myproject/,对于子目录的调用方法我们通常使用'.'来链接 -> root.level1.level2
我们现在的位置是folderA,假设我们需要调用folderB的testB.py,我们可以使用
from myproject.folderB import testB
那我们是不是也可以这样呢
from myproject.folderA import testA
很遗憾,是不能的。为什么会这样呢?因为仔细观察两个目录你可以发现folderA下并没有init.py,这样这个目录就只是文件夹而不是package,这意味着不能被import.