python-task5-模块和包的导入

本文详细介绍了Python中模块和包的导入机制,包括模块的调佣注意事项、重点内容,如模块与包的区别,相对导入和绝对导入的使用场景和优缺点。强调了文件夹作为包的条件,以及如何进行跨目录的导入。最后提供了导入总结和实例,帮助理解不同情况下的导入方式。
摘要由CSDN通过智能技术生成

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(), "../.."))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值