Python是一门非常灵活的语言,代码组织可以从一个文件到一个目录,再到包含很多目录很多文件的工程。
当代码量越来越大的时候,要思考如何将代码模块化,如何能更加优雅的组织文件。
Python中有模块的概念,对应的就是一个py文件;包的概念对应的就是一个目录,在Python2
中,
包中必须存在__init__.py
文件,在Python3
中这个规定已经不存在了,一个目录就是一个包。
导入分为相对导入和绝对导入,在相对导入中又分为隐式导入和显示导入,隐式导入在Python3中已经废弃了,所以现在所提的相对导入指的是显示相对导入
from .xxx import yyy
.代表当前文件所在的目录
..代表当前文件的上一级目录
...以此类推
from . import yyy
# 可以是从__init__.py文件中导入
from a.b.c import yyy
与相对导入不同的是绝对导入,标明了导入的文件的路径
Python提供了这两种导入方式,应该如何去组织代码。
官方推荐的是使用绝对导入,这样看着很清晰,Pycharm也提供了强大的重命名功能,一旦我们改变文件名或者目录名,import语句都会发生改变
我目前的方法是,在一个固定的,提供接口的模块内部使用相对导入,在外部的gui或者command接口文件使用绝对导入
绝对导入的路径应该怎么写?
在github上下载了几个项目,基本上是以下结构
project
| main.py
├─mod1
└─mod2
manage.py或者main.py在最外层,然后在main.py中导入模块
from mod1.package1 import xxx
from mod2.package2 import yyy
在运行的时候直接可以
python main.py 参数
入口文件main.py所在的文件夹会添加到sys.path的第一项,所以可以寻找到mod1和mod2包
以这种方式启动,入口文件中不能包含相对导入
如有错误,请大佬指正!
https://ke.sifou.com/course/1650000037773462
https://segmentfault.com/a/1190000018032094
原文:https://www.cnblogs.com/makerdd/p/14539742.html