模块
模块就是工具包,要想使用这个工具包中的工具(比如函数)就要导入这个模块
模块是非常简单的Python文件,单个Python文件就是一个模块,两个模块就是两个Python文件
模块的导入
import 模块名1,模块名2
import 模块名.函数名
from 模块名 import 函数名/变量名
import 长模块名 as 短模块名
from 模块名 as import *
问题1
为什么必须加上模块名调用呢?
import 模块名.函数名
因为可能存在这样一种情况:在多个模块含有相同名称的函数,如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以像上述这样引入模块的时候调用函数必须加上模块名
问题2
如果只需要用到模块中的某个函数/变量/类,如何导入呢?
from 模块名 import 函数/变量名
通过这种方式引入的时候调用函数时只能给出函数名不能给出模块名,但是当两个模块中含有相同名称的函数时后面一次引入会覆盖前面一次引入
问题3
如果导入的模块名/函数名/变量名过长,该如何操作?
import 长模块名 as 短模块名
from 模块名 import 长函数名 as 短函数名
问题4
如果要把一个模块中的所有内容全部导入该如何操作?
from 模块名 import *
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多使用
问题5
模块中的__all__有什么作用?
如果一个文件中有all变量,那么也就意味着没有在这个变量中的元素,不会被from 模块名 import * 导入
问题6
模块中的__name__ == 'main’有什么作用?
判断当前代码是否是被其他代码导入的,如果不是则执行里面的内容
包
包将有联系的模块组织在一起有效避免了模块名称冲突问题,让应用组织结构更加清晰
包的制作与导入
制作包的框架
在包中写入自定义内容
导入
使用包
运行结果
自动化发送邮件代码
需要安装yagmil模块和schedule模块
import yagmail
def send_mail(sender='[email protected]',password=None,receivers=None,subject='自动化发送邮件',
contents=None,attaches=None,host='smtp.qq.com'):
"""..."""
try:
# host 是smtp服务器,QQ邮箱:smtp.qq.com 163邮箱: smtp.163.com
mail = yagmail.SMTP(user=sender,password=password,host=host)
# 真正发送邮件
mail.send(to=receivers,subject=subject,contents=contents,attachments=attaches)
except Exception as e:
print('发送邮件失败,失败原因是:', e)
else:
print('[主题:%s]邮件发送成功' %(subject))
if __name__ == '__main__':
import schedule
# 授权码
password = 'rfwethjddustecbf'
friends = ['******@qq.com']
subject = ['邮件报警,磁盘已使用90%']
# h1是一级标题,style='color:red'红色显示
contents = ['邮件告警',"<hi style='color:red'>磁盘已使用90%</h1>"]
attaches = ['bao.py']
# 定时任务,为了测试,每隔2秒执行一次
schedule.every(1).seconds.do(send_mail,password=password,
receivers=friends,
subject=subject,
contents=contents,
attaches=attaches)
while True:
schedule.run_pending()