淺copy與deepcopyhtml
深淺拷貝之間的區別?python
import copy b=copy.deepcopy(a)
b=copy.copy(a)
可變與不可變linux
copy.copy() # 淺拷貝 copy.deepcopy() # 深拷貝
引計數git
標記-清除正則表達式
分代回收shell
TCP協議express
UDP協議windows
三次握手緩存
三次握手過程說明bash
四次揮手
四次揮手過程說明
11種狀態
因爲TCP鏈接是全雙工的,斷開鏈接會比創建鏈接麻煩一點點。
CLOSING狀態表示:
LISTEN --------------- # 等待從任何遠端TCP 和端口的鏈接請求。 SYN_SENT ----------- # 發送完一個鏈接請求後等待一個匹配的鏈接請求。 SYN_RECEIVED ------ # 發送鏈接請求而且接收到匹配的鏈接請求之後等待鏈接請求確認。 ESTABLISHED -------- # 表示一個打開的鏈接,接收到的數據能夠被投遞給用戶。鏈接的數據傳輸階段的正常狀態。 FIN_WAIT_1 ----------- # 等待遠端TCP 的鏈接終止請求,或者等待以前發送的鏈接終止請求的確認。 FIN_WAIT_2 ---------- # 等待遠端TCP 的鏈接終止請求。 CLOSE_WAIT --------- # 等待本地用戶的鏈接終止請求。 CLOSING ------------- # 等待遠端TCP 的鏈接終止請求確認。 LAST_ACK ------------ # 等待先前發送給遠端TCP 的鏈接終止請求的確認(包括它字節的鏈接終止請求的確認) TIME_WAIT ----------- # 等待足夠的時間過去以確保遠端TCP 接收到它的鏈接終止請求的確認。 CLOSED --------------- # 不在鏈接狀態(這是爲方便描述假想的狀態,實際不存在)
TIME_WAIT 兩個存在的理由:
>>> def f(s): ... return s.title() ... >>> l = map(f, ['pYthon', 'jaVa', 'kOtlin']) >>> list(l) ['Python', 'Java', 'Kotlin']
lists= [11,22,33,44,55] ret = map(lambda x:x if x % 2 != 0 else x + 100,lists) print(list(ret)) # 運行結果: [11, 122, 33, 144, 55]
lists= [11,22,33,44,55] def add(num): if num%2 == 0: return num else: return num + 100 rs = map(add, lists)
# 例若有一個list,裏邊的元素都是字符串,要把它拼接成一個字符串: >>> from functools import reduce >>> def f(x, y): ... return x + y ... >>> reduce(f, ['ab', 'c', 'de', 'f']) 'abcdef'
from functools import reduce def f(x, y): return x + y print(reduce(f, [1, 3, 5, 7, 9])) # 25 # 一、先計算頭兩個元素:f(1, 3),結果爲4; # 二、再把結果和第3個元素計算:f(4, 5),結果爲9; # 三、再把結果和第4個元素計算:f(9, 7),結果爲16; # 四、再把結果和第5個元素計算:f(16, 9),結果爲25; # 五、因爲沒有更多的元素了,計算結束,返回結果25。 print( reduce(lambda x, y: x + y, [1, 3, 5, 7, 9]) ) # 25
'''使用reduce將字符串反轉''' s = 'Hello World' from functools import reduce result = reduce(lambda x,y:y+x,s) # 一、第一次:x=H,y=e => y+x = eH # 二、第二次:x=l,y=eH => y+x = leH # 三、第三次:x=l,y=leH => y+x = lleH print( result ) # dlroW olleH
例如一個list中元素有純字母、純數字、字母數字組合的,咱們要保留純字母的: >>> def f(s): ... return s.isalpha() ... >>> l = filter(f, ['abc', 'xyz', '123kg', '666']) >>> list(l) ['abc', 'xyz']
>>> sorted([6, -2, 4, -1]) [-2, -1, 4, 6] >>> sorted([6, -2, 4, -1], key=abs) [-1, -2, 4, 6] >>> sorted([6, -2, 4, -1], key=abs, reverse=True) [6, 4, -2, -1] >>> sorted(['Windows', 'iOS', 'Android']) ['Android', 'Windows', 'iOS'] >>> d = [('Tom', 170), ('Jim', 175), ('Andy', 168), ('Bob', 185)] >>> def by_height(t): ... return t[1] ... >>> sorted(d, key=by_height) [('Andy', 168), ('Tom', 170), ('Jim', 175), ('Bob', 185)]
sorted和sort區別
sorted使用
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] print( sorted(students, key=lambda s: s[2], reverse=False) ) # 按年齡排序 # 結果:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
d = {'k1':1, 'k3': 3, 'k2':2} # d.items() = [('k1', 1), ('k3', 3), ('k2', 2)] a = sorted(d.items(), key=lambda x: x[1]) print(a) # [('k1', 1), ('k2', 2), ('k3', 3)]
>>> a = 'cheesezh' >>> b = 'cheesezh' >>> a == b True
>>> x = y = [4,5,6] >>> z = [4,5,6] >>> x == y True >>> x == z True >>> x is y True >>> x is z False >>> >>> print id(x) 3075326572 >>> print id(y) 3075326572 >>> print id(z) 3075328140
下面再來看一個例子,例3中同一類型下的a和b的(a==b)都是爲True,而(a is b)則否則。
>>> a = 1 #a和b爲數值類型 >>> b = 1 >>> a is b True >>> id(a) 14318944 >>> id(b) 14318944 >>> a = 'cheesezh' #a和b爲字符串類型 >>> b = 'cheesezh' >>> a is b True >>> id(a) 42111872 >>> id(b) 42111872 >>> a = (1,2,3) #a和b爲元組類型 >>> b = (1,2,3) >>> a is b False >>> id(a) 15001280 >>> id(b) 14790408 >>> a = [1,2,3] #a和b爲list類型 >>> b = [1,2,3] >>> a is b False >>> id(a) 42091624 >>> id(b) 42082016 >>> a = {'cheese':1,'zh':2} #a和b爲dict類型 >>> b = {'cheese':1,'zh':2} >>> a is b False >>> id(a) 42101616 >>> id(b) 42098736 >>> a = set([1,2,3])#a和b爲set類型 >>> b = set([1,2,3]) >>> a is b False >>> id(a) 14819976 >>> id(b) 14822256
經過例3可看出,只有數值型和字符串型的狀況下,a is b才爲True,當a和b是tuple,list,dict或set型時,a is b爲False。
open函數用來打開文件
with open("data1.txt",'r',encoding = 'utf-8') as f: for line in f: print(line)
三種讀操做比較
#1. read()一次讀取全部內容 '''aaa111 bbb222''' f = open(r"data.txt") print(f.read()) f.close() #2. readline(),每次只讀取一行,光標下移 ''' 0: aaa111 1: bbb222 ''' f = open(r"data.txt") for i in range(2): print(str(i) + ": " + f.readline(),) #3. 一次讀取全部,每行做爲列表的一個值 '''['aaa111\n', 'bbb222\n']''' f = open(r"data.txt") print(f.readlines())
讀取大文件正確方式
#!/usr/bin/python # -*- coding: utf-8 -*- def read_big_file_v(fname): block_size = 1024 * 8 with open(fname,encoding="utf8") as fp: while True: chunk = fp.read(block_size) # 當文件沒有更多內容時,read 調用將會返回空字符串 '' if not chunk: break print(chunk) path = r'C:\aaa\luting\edc-backend\tttt.py' read_big_file_v(path)
使用read()讀文件
f = open(r"somefile.txt") print(f.read(7)) # Welcome 先讀出 7 個字符 print(f.read(4)) #‘ to ‘ 接着上次讀出 4 個字符 f.close()
f = open(r"somefile.txt", "w") f.write("01234567890123456789") f.seek(5) f.write("Hello, World!") f.close() f = open(r"somefile.txt") print(f.read()) # 01234Hello, World!89
f = open(r"somefile.txt") f.read(1) f.read(2) print(f.tell()) # 3 3就是讀取到文件的第三個字符
readline()讀文件
f1 = open('test02.py','r') f2 = open('test.txt','w') while True: line = f1.readline() if not line: break f2.write(line) f1.close() f2.close()
readlines()讀文件
f1=open("readline.txt","r") for line in f1.readlines(): print(line)
將data1.txt中內容讀取並寫入到data2.txt中
f1 = open('data1.txt','r') f2 = open('data2.txt','w') for line in f1: f2.write(line) f1.close() f2.close()
使用eval()方法將文件讀取成字典
f = open('data1.txt') f1 = (f.read()) data = eval(f1) f.close() print(data) # 運行結果: {'k2': 'v2', 'k3': 'v3', 'k1': 'v1'}
將文件內容讀取成列表
lock = [] f = open("password.txt") for name in f.readlines(): lock.append(name.strip('\n')) print(lock) 運行結果: ['aaa 111', 'bbb 222', 'ccc 333']
閉包概念
閉包特色
#閉包函數的實例 def outer( a ): b = 10 def inner(): # 在內函數中 用到了外函數的臨時變量 print(a+b) # 外函數的返回值是內函數的引用 return inner if __name__ == '__main__': demo = outer(5) demo() # 15 # 在這裏咱們調用外函數傳入參數5 # 此時外函數兩個臨時變量 a是5 b是10 ,並建立了內函數,而後把內函數的引用返回存給了demo # 外函數結束的時候發現內部函數將會用到本身的臨時變量,這兩個臨時變量就不會釋放,會綁定給這個內部函數 # 咱們調用內部函數,看一看內部函數是否是能使用外部函數的臨時變量 # demo存了外函數的返回值,也就是inner函數的引用,這裏至關於執行inner函數
閉包中內函數修改外函數局部變量
#修改閉包變量的實例 def outer( a ): b = 10 # a和b都是閉包變量 c = [a] # 這裏對應修改閉包變量的方法2 def inner(): # 方法一: nonlocal關鍵字聲明(python3) nonlocal b b+=1 # 方法二: 把閉包變量修改爲可變數據類型 好比列表(python2) c[0] += 1 print(c[0]) print(b) return inner # 外函數的返回值是內函數的引用 if __name__ == '__main__': demo = outer(5) demo() # 6 11
什麼是with語句
with語句使用場景
with處理文件操做的實例
with open('/etc/passwd') as f: for line in f: print(line) # 這段代碼的做用:打開一個文件,若是一切正常,把文件對象賦值給f,而後用迭代器遍歷文件中每一行,當完成時,關閉文件; # 而不管在這段代碼的任何地方,若是發生異常,此時文件仍會被關閉。
各類編碼由來
Unicode(每一個字母須要用兩個字節:a/b/c)
Utf-8 : 可變長碼, 是Unicode 的擴展集
python2和python3中編碼轉換
re模塊(一)
'.' # 默認匹配除\n以外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行 2 '^' # 匹配字符開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) 3 '$' # 匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也能夠 4 '*' # 匹配*號前的字符0次或屢次,re.findall("ab*","cabb3abcbbac") 結果爲['abb', 'ab', 'a'] 5 '+' # 匹配前一個字符1次或屢次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb'] 6 '?' # 匹配前一個字符1次或0次 7 '{m}' # 匹配前一個字符m次 8 '{n,m}' # 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb'] 9 '|' # 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' 10 '(...)' # 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c 11 12 '\A' # 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 13 '\Z' # 匹配字符結尾,同$ 14 '\d' # 匹配數字0-9 15 '\D' # 匹配非數字 16 '\w' # 匹配[A-Za-z0-9] 17 '\W' # 匹配非[A-Za-z0-9] 18 's' # 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t' 19 \b # 匹配一個單詞邊界,也就是指單詞和空格間的位置,如,「er\b」能夠匹配「never」中的「er」,但不能匹配「verb」中的「er」 20 \B # 匹配非單詞邊界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」
函數 描述 compile(pattern[, flags]) # 根據正則表達式字符串建立模式對象 search(pattern, string[, flags]) # 在字符串中尋找模式 match(pattern, 經常使用模塊[, flags]) # 在字符串的開始處匹配模式 split(pattern, string[, maxsplit=0]) # 根據模式的匹配項來分割字符串 findall(pattern, string) # 列出字符串中模式的全部匹配項並以列表返回 sub(pat, repl, string[, count=0]) # 將字符串中全部pat的匹配項用repl替換 escape(string) # 將字符串中全部特殊正則表達式字符轉義
re.compile(pattern[, flags])
import re mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') ret = re.match(mobile_re,'18538762511') print(ret) # <_sre.SRE_Match object; span=(0, 11), match='18538652511'>
search(pattern, string[, flags]) 和 match(pattern, string[, flags])
import re a =re.match('www.bai', 'www.baidu.com') b = re.match('bai', 'www.baidu.com') print(a.group()) # www.bai print(b) # None # 不管有多少個匹配的只會匹配一個 c = re.search('bai', 'www.baidubaidu.com') print(c) # <_sre.SRE_Match object; span=(4, 7), match='bai'> print(c.group()) # bai
split(pattern, string[, maxsplit=0])
import re text = 'aa 1bb###2cc3ddd' print(re.split('\W+', text)) # ['aa', '1bb', '2cc3ddd'] print(re.split('\W', text)) # ['aa', '1bb', '', '', '2cc3ddd'] print(re.split('\d', text)) # ['aa ', 'bb###', 'cc', 'ddd'] print(re.split('#', text)) # ['aa 1bb', '', '', '2cc3ddd'] print(re.split('#+', text)) # ['aa 1bb', '2cc3ddd']
findall(pattern, string)
import re p = re.compile(r'\d+') print(p.findall('one1two2three3four4')) # ['1', '2', '3', '4'] print(re.findall('o','one1two2three3four4')) # ['o', 'o', 'o'] print(re.findall('\w+', 'he.llo, wo#rld!')) # ['he', 'llo', 'wo', 'rld']
sub(pat, repl, string[, count=0])
import re test="Hi, nice to meet you where are you from?" print(re.sub(r'\s','-',test)) # Hi,-nice-to-meet-you-where-are-you-from? print(re.sub(r'\s','-',test,5)) # Hi,-nice-to-meet-you-where are you from? print(re.sub('o','**',test)) # Hi, nice t** meet y**u where are y**u fr**m?
escape(string)
import re print(re.escape('www.python.org'))
re模塊中的匹配對象和組 group()
import re a = "123abc321efg456" print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) # 123abc321 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups()) # ('123', 'abc', '321') print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) # 123 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) # abc print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) # 321 import re m = re.match('(..).*(..)(..)','123456789') print(m.group(0)) # 123456789 print(m.group(1)) # 12 print(m.group(2)) # 67 print(m.group(3)) # 89
import re m = re.match('www\.(.*)\..*','www.baidu.com') print(m.group(1)) # baidu print(m.start(1)) # 4 print(m.end(1)) # 9 print(m.span(1)) # (4, 9)
import re test = 'dsfdf 22 g2323 GigabitEthernet0/3 10.1.8.1 YES NVRAM up eee' # print(re.match('(\w.*\d)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+YES\s+NVRAM\s+(\w+)\s+(\w+)\s*', test).groups()) ret = re.search( r'(\w*\/\d+).*\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*(\s+up\s+)',test ).groups() print(ret) # 運行結果: ('GigabitEthernet0/3', '10.1.8.1', ' up ') #1. (\w*\d+\/\d+) 匹配結果爲:GigabitEthernet0/3 #1.1 \w*: 匹配全部字母數字 #1.2 /\d+:匹配全部斜槓開頭後根數字 (好比:/3 ) #2. (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) 匹配結果爲:10.1.8.1 #3. \s+up\s+ 匹配結果爲: up 這個單詞,先後都爲空格
re模塊其餘知識點
import re #匹配時忽略大小寫 print(re.search("[a-z]+","abcdA").group()) #abcd print(re.search("[a-z]+","abcdA",flags=re.I).group()) #abcdA #連同換行符一塊兒匹配: #'.'默認匹配除\n以外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行 print(re.search(r".+","\naaa\nbbb\nccc").group()) #aaa print(re.search(r".+","\naaa\nbbb\nccc",flags=re.S)) #<_sre.SRE_Match object; span=(0, 12), match='\naaa\nbbb\nccc'> print(re.search(r".+","\naaa\nbbb\nccc",flags=re.S).group()) aaa bbb ccc
1)init_l=[i for i in re.split('(\-\d+\.*\d*)',expression) if i] a. 按照相似負數的字符串分割成列表 b. \-\d+\.*\d*是爲了能夠匹配浮點數(好比:3.14) c. (if i)是爲了去除列表中的空元素 d. 分割結果:['-1', '-2', '*((', '-60', '+30+(', 2)re.search('[\+\-\*\/\(]$',expression_l[-1]) a. 匹配expression_l列表最後一個元素是 +,-,*,/,( 這五個符號就是負數 3)new_l=[i for i in re.split('([\+\-\*\/\(\)])',exp) if i] a. 將字符串按照+,-,*,/,(,)切分紅列表(不是正真的負數就切分) 4)print(re.split('([\+\-])','-1+2-3*(2*2+3)')) #按照加號或者減號分割成列表 運行結果: ['', '-', '1', '+', '2', '-', '3*(2*2', '+', '3)']
paramiko模塊(二)
在windows中安裝paramiko: pip3 install paramiko
linux中scp命令的使用
ssh root@10.1.0.51 #ssh遠程登陸 scp -rp aa.txt root@10.1.0.50:/tmp/ #將本地aa.txt文件複製到10.1.0.50的/tmp文件夾中
Paramiko模塊做用
paramiko基於用戶名密碼鏈接
import paramiko # 1 建立SSH對象 ssh = paramiko.SSHClient() # 2 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 3 鏈接服務器 ssh.connect(hostname='1.1.1.3', port=22, username='root', password='chnsys@2016') # 4 執行命令 #stdin標準輸入: 本身輸入的命令 stdin, stdout, stderr = ssh.exec_command('pwd') # stdout標準輸出: 命令執行結果 # 5 獲取命令結果 #stderr標準錯誤: 命令執行報錯的結果 res, err = stdout.read(), stderr.read() result = res if res else err print(result.decode()) #運行結果: /root # 6 關閉鏈接 ssh.close()
import paramiko #1 鏈接客戶端 transport = paramiko.Transport(('10.1.0.50',22)) transport.connect(username='root',password='chnsys@2016') #2 定義與客戶端交互 將剛剛定義的transport當參數傳遞給他 sftp = paramiko.SFTPClient.from_transport(transport) #3 將location.py 上傳至服務器 /tmp/test.py sftp.put(r'C:\bbb\file.txt', '/tmp/file.txt') #4 將remove_path 下載到本地 local_path sftp.get('/tmp/file.txt',r'C:\bbb\file.txt') #5 關閉鏈接 transport.close()
在兩臺Linux中演示無密碼ssh登錄對方
[tom@localhost .ssh]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/tom/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/tom/.ssh/id_rsa. Your public key has been saved in /home/tom/.ssh/id_rsa.pub.
手動建立祕鑰並手動copy到被管理服務器(法2:較複雜)
[root@localhost /]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. #存放私鑰 的路徑 Your public key has been saved in /root/.ssh/id_rsa.pub. #存放公約 的路徑 注:將10.1.0.51上生成的密鑰對中的公鑰放到10.1.0.50的服務器tom用戶家目錄/home/tom/.ssh/authorized_keys 中,就能夠在10.1.0.51中無密碼登錄10.1.0.50了
一、mkdir /home/tom/.ssh #建立/home/tom/.ssh目錄 二、chmod 700 /home/tom/.ssh/ #將目錄權限改成 700 三、touch /home/tom/.ssh/authorized_keys #建立/home/tom/.ssh/authorized_keys文件 四、chmod 600 /home/tom/.ssh/authorized_keys #將文件權限改成600 五、將10.1.0.51的公鑰文件粘貼到10.1.0.50的/home/tom/.ssh/authorized_keys中
paramiko基於公鑰密鑰鏈接:(ssh_rsa)
[anyuser@localhost ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/anyuser/.ssh/id_rsa): Created directory '/home/anyuser/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/anyuser/.ssh/id_rsa. Your public key has been saved in /home/anyuser/.ssh/id_rsa.pub.
import paramiko # 1 指定公鑰所在本地的路徑 private_key = paramiko.RSAKey.from_private_key_file('id_rsa50.txt') # 2 建立SSH對象 ssh = paramiko.SSHClient() # 3 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 4 鏈接服務器 ssh.connect(hostname='10.1.0.51', port=22, username='winuser', pkey=private_key) # 5 執行命令 stdin, stdout, stderr = ssh.exec_command('pwd') # stdout標準輸出: 命令執行結果 # 6 獲取命令結果 #stderr標準錯誤: 命令執行報錯的結果 res, err = stdout.read(), stderr.read() result = res if res else err print(result.decode()) # 7 關閉鏈接 ssh.close()
複製代碼 import paramiko #1 指定公鑰所在本地的路徑 private_key = paramiko.RSAKey.from_private_key_file('id_rsa50.txt') #2 鏈接客戶端 transport = paramiko.Transport(('10.1.0.51', 22)) transport.connect(username='winuser', pkey=private_key ) #3 定義與客戶端交互 sftp = paramiko.SFTPClient.from_transport(transport) #4上傳 將本地test1.py 上傳至服務器 /tmp/test1.py sftp.put('test1.py', '/tmp/test1.py') #5下載 將服務器/tmp/test1.py文件 下載到本地C:\bbb\test1.txt sftp.get('/tmp/test1.py', r'C:\bbb\test1.txt') transport.close()
subprocess原理以及經常使用的封裝函數
#一、返回執行狀態:0 執行成功 retcode = subprocess.call(['ping', 'www.baidu.com', '-c5']) #二、返回執行狀態:0 執行成功,不然拋異常 subprocess.check_call(["ls", "-l"]) #三、執行結果爲元組:第1個元素是執行狀態,第2個是命令結果 >>> ret = subprocess.getstatusoutput('pwd') >>> ret (0, '/test01') #四、返回結果爲 字符串 類型 >>> ret = subprocess.getoutput('ls -a') >>> ret '.\n..\ntest.py' #五、返回結果爲'bytes'類型 >>> res=subprocess.check_output(['ls','-l']) >>> res.decode('utf8') '總用量 4\n-rwxrwxrwx. 1 root root 334 11月 21 09:02 test.py\n'
subprocess.check_output(['chmod', '+x', filepath]) subprocess.check_output(['dos2unix', filepath])
subprocess.Popen()
#一、先打印'parent process'不等待child的完成 import subprocess child = subprocess.Popen(['ping','-c','4','www.baidu.com']) print('parent process') #二、後打印'parent process'等待child的完成 import subprocess child = subprocess.Popen('ping -c4 www.baidu.com',shell=True) child.wait() print('parent process')
child.poll() # 檢查子進程狀態 child.kill() # 終止子進程 child.send_signal() # 向子進程發送信號 child.terminate() # 終止子進程
subprocess.PIPE 將多個子進程的輸入和輸出鏈接在一塊兒
import subprocess #下面執行命令等價於: cat /etc/passwd | grep root child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE) child2 = subprocess.Popen(["grep","root"],stdin=child1.stdout, stdout=subprocess.PIPE) out = child2.communicate() #返回執行結果是元組 print(out) #執行結果: (b'root:x:0:0:root:/root:/bin/bash\noperator:x:11:0:operator:/root:/sbin/nologin\n', None)
import subprocess list_tmp = [] def main(): p = subprocess.Popen(['ping', 'www.baidu.com', '-c5'], stdin = subprocess.PIPE, stdout = subprocess.PIPE) while subprocess.Popen.poll(p) == None: r = p.stdout.readline().strip().decode('utf-8') if r: # print(r) v = p.stdout.read().strip().decode('utf-8') list_tmp.append(v) main() print(list_tmp[0])
‘aabbccddee’
‘aaccddee’
‘bbccddee’
‘ccddee’