os.system
- 執(zhí)行的時候程序會打出cmd在linux上執(zhí)行的信息
- 執(zhí)行命令成功返回為0较屿,否則為1
- 如果想獲取在cmd輸出的內(nèi)容隧魄,是沒辦法獲到的
t2 = os.system("1adb devices")
t3 = os.system("adb devices")
print(t2) # 打印為1
print(t3) # 打印為0
subprocess.call
- 取代
os.system
隘蝎,但是也是無法獲取cmd輸出的內(nèi)容
import subprocess
t = subprocess.call('adb devices')
print(t) # 打印為0
os.popen
- popen返回的是一個file對象,跟open打開文件一樣操作了狮含,r是以讀的方式打開
output = os.popen('adb devices')
print(output.read()) # 得到List of devices attached
subprocess.Popen
-
subprocess
模塊代替os.system
、os.popen
,能夠得到命令輸出的值
shell
參數(shù)
- 在
linux
下几迄,當shell=False
(默認)時,Popen
使用os.execvp()
來執(zhí)行子程序乓旗。args
一般要是一個【列表】。如果args
是個字符串的
話屿愚,會被當做是可執(zhí)行文件的路徑,這樣就不能傳入任何參數(shù)了妆距。
subprocess.Popen("cat test.txt", shell=True)
這是因為它相當于
subprocess.Popen(["/bin/sh", "-c", "cat test.txt"])
stdin
stdout
stderr
參數(shù)
- 分別表示程序的標準輸入、輸出蚪黑、錯誤句柄中剩。他們可以是
PIPE
忌穿,文件描述符或文件對象结啼,也可以設置為None
表示從父進程繼承
- 執(zhí)行結(jié)果使用管道輸出的實例:
pipe=subprocess.Popen("adb devices",shell=True,stdout=subprocess.PIPE).stdout
print(pipe.read()) # 得到值b'List of devices attached\r\n\r\n'
cmd = "adb shell ls /sdcard/ | findstr aa.png"
fhandle = open(r"e:\aa.txt", "w")
pipe = subprocess.Popen(cmd, shell=True, stdout=fhandle).stdout
fhandle.close()
#!/usr/bin/env python
import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print out
- child1.stdout-->subprocess.PIPE
- child2.stdin<--subprocess.PIPE
- child2.stdout-->subprocess.PIPE
- 相當于將child1.stdout-->child2.stdin->child2.stdout->subprocess.PIPE
- subprocess.PIPE實際上為文本流提供一個緩存區(qū)。child1的stdout將文本輸出到緩存區(qū)朴译,隨后child2的stdin從該PIPE中將文本讀取走属铁。child2的輸出文本也被存放在PIPE中眠寿,直到
communicate()
方法從PIPE中讀取出PIPE中的文本焦蘑。
- 要注意的是,
communicate()
是Popen對象的一個方法喇肋,該方法會阻塞父進程迹辐,直到子進程完成。
- 我們還可以利用communicate()方法來使用PIPE給子進程輸入:
import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei") //()不為空明吩,則寫入subprocess.PIPE,為空,則從subprocess.PIPE讀取
- subprocess.PIPE-->child.stdin
- commiuncate相當于寫入subprocess.PIPE详羡,然后child從subprocess.PIPE讀取
- 利用python的subprocess模塊執(zhí)行外部命令, 并捕獲stdout, stderr的輸出
import subprocess
# print ’popen3:’
def external_cmd(cmd, msg_in=''):
try:
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout_value, stderr_value = proc.communicate(msg_in)
return stdout_value, stderr_value
except ValueError as err:
# log("ValueError: %s" % err)
return None, None
except IOError as err:
# log("IOError: %s" % err)
return None, None
if __name__ == '__main__':
stdout_val, stderr_val = external_cmd('dir')
print ('Standard Output: %s' % stdout_val)
print ('Standard Error: %s' % stderr_val)
p=subprocess.Popen("dir", shell=True)
p.wait()
- 但是Popen函數(shù)有一個缺陷,就是它是一個阻塞的方法善涨。如果運行cmd時產(chǎn)生的內(nèi)容非常多,函數(shù)非常容易阻塞住钢拧。解決辦法是不使用wait()方法,但是也不能獲得執(zhí)行的返回值了源内。
commands.getstatusoutput