python3使用相对路径import

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.