在对python的项目运行中,常常会遇到import的问题,特别是多层文件架构的情况下.
这样的好处包括: 1) 提高代码的复现性 2) 便于维护,可以很快发现bug
projectname/ # 项目目录
#__init__.py # 也可以变成包,供今后其他项目import
construct/ # 子包construct用于建造过程
__init__.py
brick.py # 制作砖头
wall.py # 制作墙体
misc.py # 其他不好归类的功能
...
decoration/ # 子包decoration用于装修装饰过程
__init__.py
room.py # 放间装修装饰
clean.py # 清洁
...
doc/ # 项目文档目录
buildhouse.py # 项目主程序,如果较复杂应继续分拆
README.md # 项目简介
以链接中的文件架构为例子: projectname中有两个文件夹construct 和 decoration. 在这些文件下面有不同的py文件, 一个py文件是一个模块.
概览:
1. 一定要有__init__.py文件, 无论是在projectname还是在两个子文件夹下面, 否则这些文件夹会被当成是普通目录而不是包, 里面可以为空 (只限于Python3.3之前的版本).
2. import可以使用相对路径也可以使用绝对路径.
projectname/contrcution/brick.py是使用绝对路径
. 或者.. 是使用相对路径
其中:
- . 当前目录同级查找
- .. 当前目录上级查找
在使用路径时候的注意点
首先初始位置为要进行import的这个py文件, 以下例子均以需要在wall.py中import为例,那初始的位置就是wall.py所在的位置.
分为不同的情况进行导入:
1. 如果import在同一个包中模块:
比如wall.py要引用brick.py, 对于wall而言,brick位于同一级
from . import brick
也可以是
import brick
如果是import brick中的内容:
from brick import XX
2. (跨文件夹) 如果import不在同一个包中的模块, 比如wall.py要引用room.py
有几种不同的解决方案
2.1 可以使用改为项目级别的绝对引用
from decoration.room import *
2.2
import sys
sys.path.append("..")
from decoration import room
参考的内容主要有:
https://medium.com/pyladies-taiwan/python-%E7%9A%84-import-%E9%99%B7%E9%98%B1-3538e74f57e3