https://www.cnblogs.com/linhaifeng/articles/6379069.html
https://www.cnblogs.com/greatljg/p/11156786.html
模块调佣
import module
from module import xx
from module.xx.xx import xx as rename
from module.xx.xx import **
注意:
1.模块一旦被调用,即相当于执行了另外一个py文件里的代码,模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)
2.模块:一般指一个py文件;
3.包:含有许多py文件的文件夹,含有或不含有(python3中允许,不过还是要加上比较好),
__init__文件。
4.凡是导入时带点的,点的左边都必须要是包名,而不能为模块。
5.一般来说,import后面不能带点
6.直接执行某个py文件时,会将当前py文件所在的目录添加到sys.path中,而其它模块被被导入其中时并不会将其它模块所在的目录放进sys.path中。
7.用相对路径导入: “.”表示当前目录,“…”表示上一层目录,注意这里的当前表示要导入的某个py文件所在的目录,上一层同理。相对导入时不用考虑是否在sys.path中,一般写在一个包中的__init__文件中。常用于包外使用,从包外某个py文件导入包内某些文件。
重点
文件夹被python解析器视作package需要满足两个条件:
1.文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件
2.不能作为顶层模块来执行该文件夹中的py文件(即不能作主函数的入口)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9EazYY61-1647481008945)(图片/image-20211015112009237.png)]
跨目录的导入
一般需要将两包的共同目录添加到sys.path中(这时候就需要使用到sys.path)
为了能在bin文件下的start.py文件中引入core文件夹下的core.py中的main()函数,即跨同一个目录下的两个包导入,一般需要将两个包的共有目录添加到sys.path中
## 通用格式
import os
import sys
sys.path.append(os.path.dirname(os.getcwd()))
from core import core #注意第一个core为包名,第二个py为文件名
if __name__=='__main__':
core.main()
相对导入和绝对导入
glance/ #Top-level package
├── __init__.py #Initialize the glance package
├── api #Subpackage for api
│ ├── __init__.py
│ ├── policy.py
│ └── versions.py
├── cmd #Subpackage for cmd
│ ├── __init__.py
│ └── manage.py
└── db #Subpackage for db
├── __init__.py
└── models.py
我们在glance/api/version.py中想要导入glance/cmd/manage.py
在glance/api/version.py
#绝对导入
from glance.cmd import manage
manage.main()
#相对导入
from ..cmd import manage
manage.main()
相对导入和绝对导入的总结
绝对导入:以执行文件的sys.path为起始点开始导入,称为绝对导入
优点:执行文件与被导入的模块中都可以使用
缺点:所有导入都是以sys.path为起始点,导入麻烦
相对导入:参照当前所在文件的文件夹为起始开始查找,称为相对导入
符号:.代表当前所在文件的文件夹,…代表上一层文件夹,…代表上一级的上一级文件夹
优点:导入更加简单
缺点:只能在导入包中的模块才能使用
注意:相对导入只能用于包内部模块之间的相互导入,导入者和被导入者都必须存在于包内。
总结
通过总结可以发现,当你要导入的文件在和你的当前文件在同一个目录时,你直接导入这个文件名就好了。
当你要导入的文件或者目录不和你的当前文件同目录时,你需要跳到这个你要导入文件的父级目录,然后一级一级的用点号连接走过的目录或者文件,然后就可以了 至于要怎么跳到这个这个父级目录。比较通用的就是,将父级目录加入系统路径(>>> sys.path),然后用点号一级一级的寻找,直到到达你要导入的模块
例子
当前目录、上级目录、上上级目录
import os
print '***获取当前目录***'
print os.getcwd()
print os.path.abspath(os.path.dirname(__file__))
print '***获取上级目录***'
print os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
print os.path.abspath(os.path.dirname(os.getcwd()))
print os.path.abspath(os.path.join(os.getcwd(), ".."))
print '***获取上上级目录***'
print os.path.abspath(os.path.join(os.getcwd(), "../.."))