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 = '
%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 = '
%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下为"	
",Linux下为"
"
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("离线")
检查qq是否在线状态
# 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)
get请求
# 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)
post请求
 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("	温度:最" + lowTemp[i] + '~最' + highTemp[i] )
33     print("	天气:" + weather[i])
34     print("")
35 print("
今日着装:" + 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='	')
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)
View Code
  •  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")
View Code
  •  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 -> 同意使用
  • 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',)
View Code
 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)
")
 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)
View Code
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)
")
5 obj.stdin.write("print(2)")
6 
7 out_error_list = obj.communicate()
8 print(out_error_list)
View Code
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)
View Code
  • 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 文件中
原文地址:https://www.cnblogs.com/yinjia/p/8597286.html