python_模块
- time
1 time_obj = time.localtime() 2 print("%s-%s-%s %s:%s" % (time_obj.tm_year,time_obj.tm_mon,time_obj.tm_mday,time_obj.tm_hour,time_obj.tm_min)) 3 4 print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) 5 6 print(time.strptime("2016-01-28 15:40:12","%Y-%m-%d %H:%M:%S")) 7 8 print(datetime.date.today()) 9 10 current_time = datetime.datetime.now() 11 print(current_time) 12 print(current_time.timetuple()) 13 14 new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天 15 new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天 16 new_date = datetime.datetime.now() + datetime.timedelta(hours=-10)#比现在减10小时 17 new_date = datetime.datetime.now() + datetime.timedelta(seconds=120)#比现在增加120s 18 new_date = datetime.datetime.now() + datetime.timedelta(weeks=1) #比现在加一周
- sys
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdin 输入相关 sys.stdout 输出相关 sys.stderror 错误相关 1、sys.argv使用方法: import sys,os os.mkdir(sys.argv[1]) python test4.py heelo #创建目录 2、如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加: import sys import os project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(project_path
1 import sys 2 import time 3 4 5 def view_bar(num, total): 6 rate = float(num) / float(total) 7 rate_num = int(rate * 100) 8 r = '\r%d%% |%s' % (rate_num, rate_num * "*") 9 sys.stdout.write(r) 10 sys.stdout.flush() 11 12 13 if __name__ == '__main__': 14 for i in range(0, 101): 15 time.sleep(0.1) 16 view_bar(i, 100)
import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100) r = '\r%d%%' % (rate_num, ) sys.stdout.write(r) sys.stdout.flush() if __name__ == '__main__': for i in range(0, 100): time.sleep(0.1) view_bar(i, 100)
- os
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 3 os.curdir 返回当前目录: ('.') 4 os.pardir 获取当前目录的父目录字符串名:('..') 5 os.makedirs('dir1/dir2') 可生成多层递归目录 6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 10 os.remove() 删除一个文件 11 os.rename("oldname","new") 重命名文件/目录 12 os.stat('path/filename') 获取文件/目录信息 13 os.sep 操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 14 os.linesep 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 15 os.pathsep 用于分割文件路径的字符串 16 os.name 字符串指示当前使用平台。win->'nt'; Linux->'posix' 17 os.system("bash command") 运行shell命令,直接显示 18 os.environ 获取系统环境变量 19 os.path.abspath(path) 返回path规范化的绝对路径 20 os.path.split(path) 将path分割成目录和文件名二元组返回 21 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 22 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 24 os.path.isabs(path) 如果path是绝对路径,返回True 25 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 26 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 27 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 28 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 29 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
- 序列化
python提供两个模块:json和pickle,其中功能提供有四个:dump,load,dumps,loads
1 dumps与loads写法: 2 import pickle 3 4 data = {"k1":123,"k2":"hello"} 5 6 with open("read.txt","wb") as f: 7 f.write(pickle.dumps(data)) 8 9 import pickle 10 11 with open("read.txt","rb") as f: 12 data = pickle.loads(f.read()) 13 print(data) 14 15 16 dump与load写法: 17 import pickle 18 19 data = {"k1":123,"k2":"hello"} 20 21 with open("read.txt","wb") as f: 22 pickle.dump(data,f) 23 24 import pickle 25 26 with open("read.txt","rb") as f: 27 data = pickle.load(f) 28 print(data) 29 30 json: 31 import pickle,json 32 33 data = {"k1":123,"k2":"hello"} 34 35 with open("read.txt","w") as f: 36 # f.write(pickle.dumps(data)) 37 #pickle.dump(data,f) 38 #f.write(json.dumps(data)) 39 json.dump(data,f) 40 41 import pickle,json 42 43 with open("read.txt","rb") as f: 44 # data = pickle.loads(f.read()) 45 # data = pickle.load(f) 46 # print(data) 47 48 # data = json.load(f) 49 # print(data) 50 data = json.loads(f.read()) 51 print(data)
1 转换为字符串: 2 user = [“aa”,”bb”,”cc”] 3 s = json.dumps(user) 4 print(s,type(s)) 5 6 dic = {‘k1’:123,’k2’:”ws”} 7 json.dump(dic,open(“db”,”w”)) 8 9 #字符串转换成字典 10 r = json.load(open(‘db’,’r’)) 11 print(r,type(r)) 12 13 #dumps/dump:用于元组,列表,字典等形式转换成字符串 14 #loads/load:用于字典,列表,元组等形式字符串,装换成字典,列表,元组
- 基本模块知识
1 from project.day3 import test9 2 3 print(__file__) #本身自己文件的路径 4 print(__doc__) #py文件的注释 5 print(test9.__package__) # 当前py所在文件夹,用.划分 6 print(test9.__cached__) #缓存 7 print(__name__) #只有执行python 主程序时,__name__=='__main__',否则,执行模块名 8 9 def test(): 10 """验证结果""" 11 print("测试中") 12 13 print(test.__doc__)
- requests模块
1 import urllib 2 import requests 3 from xml.etree import ElementTree as ET 4 5 # 使用内置模块urllib发送HTTP请求,或者XML格式内容 6 """ 7 f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') 8 result = f.read().decode('utf-8') 9 """ 10 11 12 # 使用第三方模块requests发送HTTP请求,或者XML格式内容 13 r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') 14 result = r.text 15 16 # 解析XML格式内容 17 node = ET.XML(result) 18 19 # 获取内容 20 if node.text == "Y": 21 print("在线") 22 else: 23 print("离线")
# 1、无参数实例 import requests ret = requests.get('https://github.com/timeline.json') print(ret.url) print(ret.text) # 2、有参数实例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url) print(ret.text)
# 1、基本POST实例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http://httpbin.org/post", data=payload) print(ret.text) # 2、发送请求头和数据实例 import requests import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)
1 import requests,json,pprint 2 3 place = input("请输入天气地点:") 4 JsonUrl = "http://wthrcdn.etouch.cn/weather_mini?city=%s" % (place) 5 TestJsonUrl = requests.get(JsonUrl) 6 try: 7 TestJsonUrl.raise_for_status() 8 except: 9 print("网址请求出错") 10 11 Data = json.loads(TestJsonUrl.text) 12 pprint.pprint(Data) 13 w = Data['data'] 14 print("地点:%s" % w['city']) 15 16 #日期 17 date_a = [] 18 #最高温与最低温 19 highTemp = [] 20 lowTemp = [] 21 #天气 22 weather =[] 23 #进行五天的天气遍历 24 for i in range(len(w['forecast'])): 25 date_a.append(w['forecast'][i]['date']) 26 highTemp.append(w['forecast'][i]['high']) 27 lowTemp.append(w['forecast'][i]['low']) 28 weather.append(w['forecast'][i]['type']) 29 30 #输出 31 print("日期:" + date_a[i]) 32 print("\t温度:最" + lowTemp[i] + '~最' + highTemp[i] ) 33 print("\t天气:" + weather[i]) 34 print("") 35 print("\n今日着装:" + w['ganmao']) 36 print("当前温度:" + w['wendu'] + "℃")
1 #通过HTTP请求和XML实现获取电视节目 2 import requests 3 from xml.etree import ElementTree as ET 4 5 payload = {'theTVstationID':3} 6 r = requests.post("http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx/getTVchannelDataSet",data=payload) 7 ret = r.text 8 9 root = ET.XML(ret) 10 for node in root.iter('TvChanne'): 11 print(node.find('tvChannel').text)
- hashlib加密
主要提供了SHA1,SHA256,SHA384,SHA512,MD5算法。
1 import hashlib 2 3 # ######## md5 ######## 4 hash = hashlib.md5() 5 # help(hash.update) 6 hash.update(bytes('admin', encoding='utf-8')) 7 print(hash.hexdigest()) 8 print(hash.digest()) 9 10 11 ######## sha1 ######## 12 13 hash = hashlib.sha1() 14 hash.update(bytes('admin', encoding='utf-8')) 15 print(hash.hexdigest()) 16 17 # ######## sha256 ######## 18 19 hash = hashlib.sha256() 20 hash.update(bytes('admin', encoding='utf-8')) 21 print(hash.hexdigest()) 22 23 24 # ######## sha384 ######## 25 26 hash = hashlib.sha384() 27 hash.update(bytes('admin', encoding='utf-8')) 28 print(hash.hexdigest()) 29 30 # ######## sha512 ######## 31 32 hash = hashlib.sha512() 33 hash.update(bytes('admin', encoding='utf-8')) 34 print(hash.hexdigest()) 35 36 如需要安全可靠,对加密算法中添加自定义key再来做加密: 37 import hashlib 38 39 # ######## md5 ######## 40 41 hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8")) 42 hash.update(bytes('admin',encoding="utf-8")) 43 print(hash.hexdigest()) 44 45 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密: 46 import hmac 47 48 h = hmac.new(bytes('898oaFs09f',encoding="utf-8")) 49 h.update(bytes('admin',encoding="utf-8")) 50 print(h.hexdigest())
- xml
1 xml文件格式如下: 2 <data> 3 <country name="Liechtenstein"> 4 <rank updated="yes">2</rank> 5 <year>2023</year> 6 <gdppc>141100</gdppc> 7 <neighbor direction="E" name="Austria" /> 8 <neighbor direction="W" name="Switzerland" /> 9 </country> 10 <country name="Singapore"> 11 <rank updated="yes">5</rank> 12 <year>2026</year> 13 <gdppc>59900</gdppc> 14 <neighbor direction="N" name="Malaysia" /> 15 </country> 16 <country name="Panama"> 17 <rank updated="yes">69</rank> 18 <year>2026</year> 19 <gdppc>13600</gdppc> 20 <neighbor direction="W" name="Costa Rica" /> 21 <neighbor direction="E" name="Colombia" /> 22 </country> 23 </data>
1、解析xml 利用ElementTree.XML将字符串解析成xml对象 from xml.etree import ElementTree as ET with open("testxml.xml","r") as f: root = ET.XML(f.read()) print(root.tag) 利用ElementTree.parse将文件直接解析成xml对象 from xml.etree import ElementTree as ET root = ET.parse("testxml.xml") test = root.getroot() print(test) 2、遍历xml文档的所有内容 from xml.etree import ElementTree as ET root = ET.parse("testxml.xml") test = root.getroot() print(test.tag) for child in test: print(child.tag,child.attrib) for i in child: print(i.tag,i.text) 3、遍历xml中指定的节点 from xml.etree import ElementTree as ET root = ET.parse("testxml.xml") test = root.getroot() print(test.tag) for node in test.iter("year"): print(node.tag,node.text) 4、修改节点内容 from xml.etree import ElementTree as ET root = ET.parse("testxml.xml") test = root.getroot() print(test.tag) for node in root.iter("year"): #将year节点内容自增一 new_year = int(node.text) + 1 node.text = str(new_year) # 设置属性 node.set('name','yinjia') node.set('age','18') #删除属性 del node.attrib['name'] root.write('testxml.xml',encoding='utf-8') 5、删除节点 from xml.etree import ElementTree as ET root = ET.parse("testxml.xml") test = root.getroot() print(test.tag) for node in test.findall('country'): rank = int(node.find("rank").text) if rank > 50: test.remove(node) root.write("testxml.xml",encoding='utf-8')
- 创建xml文档
1 from xml.etree import ElementTree as ET 2 3 #创建根节点 4 root = ET.Element("Home") 5 6 #创建节点大儿子 7 son1 = ET.Element("son",{"name":"儿1"}) 8 #创建节点小儿子 9 son2 = ET.Element("son",{"name":"儿2"}) 10 11 #在大儿子中创建两个孙子 12 grandson1 = ET.Element("grandson",{"name":"孙1"}) 13 grandson2 = ET.Element("grandson",{"name":"孙2"}) 14 son1.append(grandson1) 15 son1.append(grandson2) 16 17 #把儿子添加到根节点 18 root.append(son1) 19 root.append(son2) 20 21 tree = ET.ElementTree(root) 22 tree.write('creat.xml',encoding='utf-8',short_empty_elements=False)
1 from xml.etree import ElementTree as ET 2 3 #创建根节点 4 root = ET.Element("Home") 5 6 #创建节点大儿子 7 son1 = root.makeelement("son",{"name":"儿1"}) 8 9 #创建节点小儿子 10 son2= root.makeelement("son",{"name":"儿2"}) 11 12 #在大儿子中创建两个孙子 13 grandson1 = son1.makeelement("grandson",{"name":"孙1"}) 14 grandson2 = son1.makeelement("grandson",{"name":"孙2"}) 15 16 son1.append(grandson1) 17 son1.append(grandson2) 18 19 #把儿子添加到根节点 20 root.append(son1) 21 root.append(son2) 22 23 tree = ET.ElementTree(root) 24 tree.write('creat.xml',encoding='utf-8',short_empty_elements=False)
1 from xml.etree import ElementTree as ET 2 3 #创建根节点 4 root = ET.Element("Home") 5 6 #创建节点大儿子 7 son1 = ET.SubElement(root,"son",attrib={"name":"儿1"}) 8 #创建节点小儿子 9 son2 = ET.SubElement(root,"son",attrib={"name":"儿2"}) 10 11 #在大儿子中创建一个孙子 12 grandson1 = ET.SubElement(son1,"grandson",attrib={"name":"孙1"}) 13 grandson1.text = "孙子" 14 15 et = ET.ElementTree(root)#生成文档对象 16 et.write("test.xml",encoding='utf-8',xml_declaration=True)
优化默认保存设置成缩进格式,如下:
1 #优化改进默认设置成缩进格式 2 from xml.etree import ElementTree as ET 3 from xml.dom import minidom 4 5 def prettify(elem): 6 """ 7 将节点转换成字符串,并添加缩进 8 :param elem: 9 :return: 10 """ 11 rough_string = ET.tostring(elem,"utf-8") 12 reparsed = minidom.parseString(rough_string) 13 return reparsed.toprettyxml(indent='\t') 14 15 #创建根节点 16 root = ET.Element("Home") 17 18 #创建节点大儿子 19 son1 = ET.SubElement(root,"son",attrib={"name":"儿1"}) 20 #创建节点小儿子 21 son2 = ET.SubElement(root,"son",attrib={"name":"儿2"}) 22 23 #在大儿子中创建一个孙子 24 grandson1 = ET.SubElement(son1,"grandson",attrib={"name":"孙1"}) 25 grandson1.text = "孙子" 26 27 raw_str = prettify(root) 28 with open("test.xml",'w',encoding='utf-8') as f: 29 f.write(raw_str)
- xml命名空间
假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。 使用前缀来避免命名冲突 此文档带有某个表格中的信息: <h:table> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table> 此 XML 文档携带着有关一件家具的信息: <f:table> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table> 现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。 通过使用前缀,我们创建了两种不同类型的 <table> 元素。
1 from xml.etree import ElementTree as ET 2 3 ET.register_namespace('com',"http://www.company.com") #some name 4 5 # build a tree structure 6 root = ET.Element("{http://www.company.com}STUFF") 7 body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"}) 8 body.text = "STUFF EVERYWHERE!" 9 10 # wrap it in an ElementTree instance, and save as XML 11 tree = ET.ElementTree(root) 12 13 tree.write("page.xml", 14 xml_declaration=True, 15 encoding='utf-8', 16 method="xml")
- Configparser模块
1 #config.ini配置文件 2 3 [com1] 4 port = 80 5 url = www.shou.com 6 k1 = 123 7 8 [com2] 9 admin = test 10 password = 123
1 import configparser 2 3 #读取文件操作 4 con = configparser.ConfigParser() 5 con.read("config.ini",encoding='utf-8') 6 7 result = con.sections() #获取所有项名 8 print(result) 9 10 result1 = con.options("com1") #获取某项名属下的键名 11 print(result1) 12 13 result2 = con.items("com2") #获取某项名下的所有键值对 14 print(result2) 15 16 result3 = con.get("com1","ip") #获取指定节点下指定的key的值 17 print(result3)
1 import configparser 2 3 #检查、删除、设置等操作方法 4 con = configparser.ConfigParser() 5 con.read("config.ini",encoding='utf-8') 6 7 #检查 8 test1 = con.has_section("com1") 9 print(test1) 10 11 #添加节点 12 con.add_section("add_test") 13 con.write(open("config.ini",'w')) 14 15 #删除节点 16 con.remove_section("add_test") 17 con.write(open("config.ini",'w')) 18 19 20 #检查、删除、设置指定组内的键值对 21 #检查 22 test2 = con.has_option("com1","ip") 23 print(test2) 24 25 #删除 26 test3 = con.remove_option("com1","ip") 27 con.write(open("config.ini",'w')) 28 29 #设置键值对 30 con.set("add_test","k1","123") 31 con.write(open("config.ini",'w'))
-
Shutil模块
1 #高级的文件、文件夹、压缩包处理。 2 Shutil.make_archive(base_name,format,…) 3 #创建压缩包并返回文件路径,例如:zip/tar 4 base_name: 压缩名的文件名,也可以是压缩包文件路径,只是文件名时,则保存至当前目录,否则保存至指定路径 5 如:www =》保存至当前路径 6 如:/user/www =>保存至/user/ 7 format:压缩包种类, 8 root_dir:要压缩的文件夹路径(默认当前目录) 9 owner:用户,默认当前用户 10 logger:用户记录日志,通常是logging.Logger对象 11 import shutil,zipfile 12 13 #将/user/load/test下的文件打包放置当前程序目录 14 ret1 = shutil.make_archive("www",'tar',root_dir="/user/load/test") 15 16 #将/user/load/test下的文件打包放置/user/yinjia/目录 17 ret2 = shutil.make_archive("/user/yinjia/www",'tar',root_dir='/user/load/test') 18 19 #将文件内容拷贝到另一个文件中 20 shutil.copyfileobj(open("read.txt",'r'),open("page.xml",'a')) 21 22 #拷贝文件 23 shutil.copyfile("page.xml","pagecopy.xml") 24 25 #仅拷贝权限、内容、组、用户均不变 26 shutil.copymode("page.xml","pagecopy.xml") 27 28 #拷贝状态的信息,包括:mode bits,atime,mtime,flags 29 shutil.copystat('page.xml','pagecopy.xml') 30 31 #拷贝文件和权限 32 shutil.copy('page.xml','pagecopy.xml') 33 34 #拷贝文件和状态信息 35 shutil.copy2('page.xml','pagecopy.xml') 36 37 #递归的去拷贝文件夹 38 shutil.copytree('test1','test2',ignore=shutil.ignore_patterns('*.pyc','tmp')) 39 shutil.copytree('test1','test2',symlinks=True,ignore=shutil.ignore_patterns('*.pyc','tmp')) 40 41 #递归的去删除文件 42 shutil.rmtree('test1') 43 44 #递归去移动文件,类似mv命令,其实就是重命名 45 shutil.move('test1','test2') 46 47 #压缩 48 z = zipfile.ZipFile("test.zip",'a') 49 z.write('a.log') 50 z.write('te.xml') 51 z.close() 52 53 #解压 54 z = zipfile.ZipFile("test.zip",'r') 55 z.extractall() 56 z.close() 57 #压缩 58 tar = tarfile.open("test.tar","w") 59 tar.add('/user/test/1.log',arcname='aa.log') 60 tar.add("/user/test1/2.log",arcname='bb.log') 61 tar.close() 62 63 #压缩 64 tar = tarfile.open("test1.tar",'r') 65 tar.extractall() #可设置解压地址 66 tar.close()
- subprocess 模块
call
执行命令,返回状态码
1 ret = subprocess.call(["ls", "-l"], shell=False) 2 ret = subprocess.call("ls -l", shell=True)
check_call
执行命令,如果执行状态码是 0 ,则返回0,否则抛异常
1 subprocess.check_call(["ls", "-l"]) 2 subprocess.check_call("exit 1", shell=True)
check_output
执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常
1 subprocess.check_output(["echo", "Hello World!"]) 2 subprocess.check_output("exit 1", shell=True)
subprocess.Popen(...)
参数:
- args:shell命令,可以是字符串或者序列类型(如:list,元组)
- bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
- stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
- preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
- close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。 - shell:同上
- cwd:用于设置子进程的当前目录
- env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
- universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
- startupinfo与createionflags只在windows下有效
将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
1 import subprocess 2 ret1 = subprocess.Popen(["mkdir","t1"]) 3 ret2 = subprocess.Popen("mkdir t2", shell=True)
终端输入的命令分为两种:
- 输入即可得到输出,如:ifconfig
- 输入进行某环境,依赖再输入,如:python
1 import subprocess 2 3 obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
1 import subprocess 2 3 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) 4 obj.stdin.write("print(1)\n") 5 obj.stdin.write("print(2)") 6 obj.stdin.close() 7 8 cmd_out = obj.stdout.read() 9 obj.stdout.close() 10 cmd_error = obj.stderr.read() 11 obj.stderr.close() 12 13 print(cmd_out) 14 print(cmd_error)
1 import subprocess 2 3 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) 4 obj.stdin.write("print(1)\n") 5 obj.stdin.write("print(2)") 6 7 out_error_list = obj.communicate() 8 print(out_error_list)
1 import subprocess 2 3 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) 4 out_error_list = obj.communicate('print("hello")') 5 print(out_error_list)
- logging模块
1、单文件日志
1 import logging 2 3 4 logging.basicConfig(filename='log.log', 5 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 6 datefmt='%Y-%m-%d %H:%M:%S %p', 7 level=10) 8 9 logging.debug('debug') 10 logging.info('info') 11 logging.warning('warning') 12 logging.error('error') 13 logging.critical('critical') 14 logging.log(10,'log')
日志等级
1 CRITICAL = 50 2 FATAL = CRITICAL 3 ERROR = 40 4 WARNING = 30 5 WARN = WARNING 6 INFO = 20 7 DEBUG = 10 8 NOTSET = 0
注:只有【当前写等级】大于【日志等级】时,日志文件才被记录。
2、多文件日志
如果想要设置多个日志文件,logging.basicConfig将无法完成,需要自定义文件和日志操作对象。
1 # 定义文件 2 file_1_1 = logging.FileHandler('l1_1.log', 'a', encoding='utf-8') 3 fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") 4 file_1_1.setFormatter(fmt) 5 6 file_1_2 = logging.FileHandler('l1_2.log', 'a', encoding='utf-8') 7 fmt = logging.Formatter() 8 file_1_2.setFormatter(fmt) 9 10 # 定义日志 11 logger1 = logging.Logger('s1', level=logging.ERROR) 12 logger1.addHandler(file_1_1) 13 logger1.addHandler(file_1_2) 14 15 16 # 写日志 17 logger1.critical('1111')
1 # 定义文件 2 file_2_1 = logging.FileHandler('l2_1.log', 'a') 3 fmt = logging.Formatter() 4 file_2_1.setFormatter(fmt) 5 6 # 定义日志 7 logger2 = logging.Logger('s2', level=logging.INFO) 8 logger2.addHandler(file_2_1)
如上述创建的两个日志对象
- 当使用【logger1】写日志时,会将相应的内容写入 l1_1.log 和 l1_2.log 文件中
- 当使用【logger2】写日志时,会将相应的内容写入 l2_1.log 文件中
作者:Jason
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。