python3使用相对路径import

我们来python3在导入不同目录的模块时是怎么做的

先来看一下我们的Project目录

|---myproject
├── __init__.py
├── settings.py
├── folderA
│   └── testA.py
├── folderB
│    ├── __init__.py
│   ├── testB.py
├── test.py

在相同目录下

我们现在在myproject/目录下

在同一目录下,我们可以使用’.’来表示当前目录:

1
from . import test.py

或者直接import

1
import test.py

如果你想使用同目录下某一文件的内容,假设我们test.py内有一对象名为app

1
from .test import app

在上级目录中

我们现在在folderA下

对于调用上级目录的内容,我们可以使用’..’来表示返回上一级目录,假设我们现在要调用上一层的test. py

1
from .. import test.py

如果你想使用上级目录下某一文件的内容,假设我们test.py内有一对象名为app

1
from ..test import app

在兄弟目录中

现在我们仍然在folderA下

我们可以看到,folderB是和folderA一样在myproject下面的目录,我们该怎么办呢?先返回上级目录调用,调用方法类似于上级目录下的某一文件.我们现在要调用folderB下的testB.py

1
from ..folderB import testB

init.py是什么

当一个目录下有init.py时,python将该目录认定为package。我们可以看到myproject/下面有一个init.py,这个时候myproject可以被当做package.

1
import myproject

而如果没有init.py的话,myproject只是文件夹,不可以被调用。init.py通常为空,但是也可以放从其他文件import 一些参数,假设我们的init.py引入了test.py的app

1
from .test import app

之后我们就可以直接通过包名来调用它

1
from myproject import app

从顶层调用及子目录调用

我们可以使用’.’或者’..’来调用同一级或上一级的模块和对象,但是如果你想跨过多层调用(上上级目录),你需要从顶层调用,我们当前的根目录是myproject/,对于子目录的调用方法我们通常使用’.’来链接 -> root.level1.level2

我们现在的位置是folderA,假设我们需要调用folderB的testB.py,我们可以使用

1
from myproject.folderB import testB

那我们是不是也可以这样呢

1
from myproject.folderA import testA

很遗憾,是不能的。为什么会这样呢?因为仔细观察两个目录你可以发现folderA下并没有init.py,这样这个目录就只是文件夹而不是package,这意味着不能被import.