1、subprocess模塊python
1.subprocess以及經常使用的封裝函數shell
運行python的時候,咱們都是在建立並運行一個進程。像Linux進程那樣,一個進程能夠fork一個子進程,並讓這個子進程exec另一個程序。在Python中,咱們經過標準庫中的subprocess包來fork一個子進程,並運行一個外部的程序。windows
subprocess包中定義有數個建立子進程的函數,這些函數分別以不一樣的方式建立子進程,因此咱們能夠根據須要來從中選取一個使用。另外subprocess還提供了一些管理標準流(standard stream)和管道(pipe)的工具,從而在進程間使用文本通訊。緩存
subprocess.call()bash
父進程等待子進程完成ide
返回退出信息(returncode,至關於Linux exit code)memcached
subprocess.check_call()函數
父進程等待子進程完成工具
返回0spa
檢查退出信息,若是returncode不爲0,則舉出錯誤subprocess.CalledProcessError,該對象包含有returncode屬性,可用try…except…來檢查
例:
#!/usr/bin/env python import subprocess try: subprocess.check_call("exit 1",shell=True) except subprocess.CalledProcessError: print "call fail" except Exception,e: print e print "hello,China"
運行結果:
call fail
hello,China
subprocess.check_output()
父進程等待子進程完成
返回子進程向標準輸出的輸出結果
檢查退出信息,若是returncode不爲0,則舉出錯誤subprocess.CalledProcessError,該對象包含有returncode屬性和output屬性,output屬性爲標準輸出的輸出結果,可用try…except…來檢查
例:
#!/usr/bin/env python import subprocess retcode = subprocess.check_output(["ls","-l"]) #列表通常不帶shell print retcode
運行結果:
-rw-r--r-- 1 root root 94 Jan 19 22:09 001.py
-rw-r--r-- 1 root root 255 Jan 19 22:19 002.py
-rw-r--r-- 1 root root 101 Jan 19 22:59 003.py
說明:
將程序名(ls)和所帶的參數(-l)一塊兒放在一個列表中傳遞給subprocess.check_output();
shell默認爲False,在Linux下,shell=False時, Popen調用os.execvp()執行args指定的程序;shell=True時,若是args是字符串,Popen直接調用系統的Shell來執行args指定的程序,若是args是一個序列,則args的第一項是定義程序命令字符串,其它項是調用系統Shell時的附加參數。
或例子:
#!/usr/bin/env python import subprocess retcode = subprocess.check_output("ls -l",shell=True) #通常帶參數,才加shell print retcode
subprocess.Popen()
class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
Popen對象建立後,主程序不會自動等待子進程完成。咱們必須調用對象的wait()方法,父進程纔會等待 (也就是阻塞block)
例1(父進程不等待子進程):
#!/usr/bin/env python import subprocess child = subprocess.Popen("ping -c 3 www.baidu.com",shell=True) print "hello,China"
運行結果:
hello,China
[root@huangzp3 python]# PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=56 time=7.45 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=56 time=7.29 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=56 time=8.05 ms
說明:
父進程在開啓子進程以後並無等待child的完成,而是直接運行print
例2(父進程等待子進程):
#!/usr/bin/env python import subprocess child = subprocess.Popen("ping -c 3 www.baidu.com",shell=True) child.wait() print "hello,China"
運行結果:
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=56 time=5.49 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=56 time=5.69 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=56 time=6.66 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 5.496/5.950/6.664/0.514 ms
hello,China
父進程對子進程的其餘操做:
child.poll() # 檢查子進程狀態
child.kill() # 終止子進程
child.send_signal() # 向子進程發送信號
child.terminate() # 終止子進程
child.pid #存儲子進程的PID
2.子進程的文本流控制
子進程的標準輸入、標準輸出和標準錯誤以下屬性分別表示:
child.stdin
child.stdout
child.stderr
能夠在Popen()創建子進程的時候改變標準輸入、標準輸出和標準錯誤,並能夠利用subprocess.PIPE將多個子進程的輸入和輸出鏈接在一塊兒,構成管道(pipe);如沒有寫stdin和stdout,默認將子進程執行結果打印至屏幕上,而不是保存於內存中
例1:
#!/usr/bin/env python import subprocess child = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) print child.stdout.read()
運行結果:
-rw-r--r-- 1 root root 94 Jan 19 22:09 001.py
-rw-r--r-- 1 root root 255 Jan 19 22:19 002.py
-rw-r--r-- 1 root root 149 Jan 20 00:47 003.py
例2:
#!/usr/bin/env python import subprocess child1 = subprocess.Popen(["cat","/etc/passwd"],stdout=subprocess.PIPE) child2 = subprocess.Popen(["grep","/bin/bash"],stdin=child1.stdout,stdout=subprocess.PIPE) out = child2.communicate() print out
運行結果:
r('root:x:0:0:root:/root:/bin/bash\nzabbix:x:1001:1001::/home/zabbix:/bin/bash\nelk:x:1002:1002::/home/elk:/bin/bash\nmemcached:x:1003:1003::/home/memcached:/bin/bash\n', None)
說明:
subprocess.PIPE管道實際上爲文本流提供一個緩存區。child1的stdout將文本輸出到緩存區,隨後child2的stdin從該PIPE中將文本讀取走。child2的輸出文本也被存放在PIPE中,直到communicate()方法從PIPE中讀取出PIPE中的文本;communicate()是Popen對象的一個方法,該方法會阻塞父進程,直到子進程完成;child2.communicate()至關於child2.write()、child2.close()、child2.read()這個三個方法
2、glob模塊
python下的shell通配符,用它能夠查找符合特定規則的文件路徑名,相似於windows下文件搜索。只用到三個匹配符:"*", "?", "[]"。"*"匹配0個或多個字符、"?"匹配單個字符、"[]"匹配指定範圍內的字符。
1.glob.glob
返回全部匹配的文件路徑列表。只有一個參數pathname,定義了文件路徑匹配規則,能夠爲絕對路徑,也能夠是相對路徑
例:
In [1]: import glob In [2]: glob.glob("./*.py") Out[2]: ['./20.py', './1.py',
2.glob.iglob
相比glob.glob,獲取一個可遍歷對象,使用它能夠逐個獲取匹配的文件路徑名
3、shlex模塊
shlex.split(s[, comments[, posix]])
使用相似shell的語法分割字符串s,默認按空格分隔,而且shlex.split()能識別引號,認爲引號裏的爲一個元素。
例:
In [7]: import shlex In [8]: shlex.split('hello","word') Out[8]: ['hello,word']