亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

python調用系統命令popen、system

2019-11-14 17:44:16
字體:
來源:轉載
供稿:網友

python調用Shell腳本,有兩種方法:os.system(cmd)或os.popen(cmd),前者返回值是腳本的退出狀態碼,后者的返回值是腳本執行過程中的輸出內容。所以說一般我們認為popen更加強大

os.system(cmd):

該方法在調用完shell腳本后,返回一個16位的二進制 數,低位為殺死所調用腳本的信號號碼,高位為腳本的退出狀態碼,即腳本中“exit 1”的代碼執行后,os.system函數返回值的高位數則是1,如果低位數是0的情況下,則函數的返回值是0×100,換算為10進制得到256。

os.popen(cmd):

這種調用方式是通過管道的方式來實現,函數返回一個file-like的對象,里面的內容是腳本輸出的內容(可簡單理解為echo輸出的內容)。

實例如下:

1 import numpy2 import os3 t=os.popen('ls')4 PRint t.read()5 t=os.system('ls')6 print t

效果:

server.py
setup.py
t
test
test.c
test.nja
test.o
0

-----------------------------------------------------我是分割線---------------------------------------------------------------------------------------------------------

受@趙銳指教,subprocess的Popen更實用。于是趕緊學習了一下

官方指南:https://docs.python.org/2/library/subprocess.html

官方也建議用這個替代(當然unix用戶還有個更新的subprocess32)

 這個模塊粗略的看一下主要是啟用另一個線程,并可獲取輸入,輸出以及錯誤信息等,并提供了subprocess.Popen以及他的幾個封裝函數

先介紹下封裝的函數

一、subprocess.call

  subprocess.call (*popenargs , **kwargs )

執行命令,并等待命令結束,再返回子進程的返回值。參數同Popen。我暫時的理解就是這個是加上了同步的popen。

二、subprocess.check_call

  subprocess.check_call (*popenargs , **kwargs )

執行上面的call命令,并檢查返回值,如果子進程返回非0,則會拋出CalledProcessError異常,這個異常會有個returncode 屬性,記錄子進程的返回值。

三、check_output()

執行程序,并返回其標準輸出.

 

而Popen則用起來更廣泛,用起來和call一樣,只是如果要同步要自己加上wait

借鑒一下屬性

1.Popen.poll():用于檢查子進程是否已經結束。設置并返回returncode屬性。2.Popen.wait():等待子進程結束。設置并返回returncode屬性。3.Popen.communicate(input=None):與子進程進行交互。向stdin發送數據,或從stdout和stderr中讀取數據??蛇x參數input指定發送到子進程的參數。Communicate()返回一個元組:(stdoutdata, stderrdata)。注意:如果希望通過進程的stdin向其發送數據,在創建Popen對象的時候,參數stdin必須被設置為PipE。同樣,如果希望從stdout和stderr獲取數據,必須將stdout和stderr設置為PIPE。4.Popen.send_signal(signal):向子進程發送信號。5.Popen.terminate():停止(stop)子進程。在windows平臺下,該方法將調用Windows API TerminateProcess()來結束子進程。6.Popen.kill():殺死子進程。7.Popen.stdin:如果在創建Popen對象是,參數stdin被設置為PIPE,Popen.stdin將返回一個文件對象用于策子進程發送指令。否則返回None。8.Popen.stdout:如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用于策子進程發送指令。否則返回None。9.Popen.stderr:如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用于策子進程發送指令。否則返回None。10.Popen.pid:獲取子進程的進程ID。11.Popen.returncode:獲取進程的返回值。如果進程還沒有結束,返回None。12.subprocess.call(*popenargs, **kwargs):運行命令。該函數將一直等待到子進程運行結束,并返回進程的returncode。文章一開始的例子就演示了call函數。如果子進程不需要進行交互,就可以使用該函數來創建。13.subprocess.check_call(*popenargs, **kwargs):與subprocess.call(*popenargs, **kwargs)功能一樣,只是如果子進程返回的returncode不為0的話,將觸發CalledProcessError異常。在異常對象中,包括進程的returncode信息。

關于subprocess的安全性:

不像其他的popen函數,不會直接調用/bin/sh來解釋命令,也就是說,命令中的每一個字符都會被安全地傳遞到子進程里。

這里著重介紹一下怎么用這個替換原本的幾個庫

一、替換shell命令

output=`mycmd myarg`# 替換為output = check_output(["mycmd", "myarg"]

二、替換shell管道

output=`dmesg | grep hda`# 替換為p1 = Popen(["dmesg"], stdout=PIPE)p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.output = p2.communicate()[0]

三、替換os.system()

status = os.system("mycmd" + " myarg")# 替換為status = subprocess.call("mycmd" + " myarg", shell=True)

注意:

  • 通常并不需要用shell來調用程序。
  • 用subprocess可以更方便地得到子程序的返回值。

其實,更真實的替換是:

try:
retcode = call(“mycmd” + ” myarg”, shell=True)
if retcode < 0:
print >>sys.stderr, “Child was terminated by signal”, -retcode
else:
print >>sys.stderr, “Child returned”, retcode
except OSError, e:
print >>sys.stderr, “Execution failed:”, e

代替os.spawn系列
P_NOWAIT的例子

pid = os.spawnlp(os.P_NOWAIT, “/bin/mycmd”, “mycmd”, “myarg”)
等效于
pid = Popen(["/bin/mycmd", "myarg"]).pid

P_WAIT的例子

retcode = os.spawnlp(os.P_WAIT, “/bin/mycmd”, “mycmd”, “myarg”)
等效于
retcode = call(["/bin/mycmd", "myarg"])

Vector的例子

os.spawnvp(os.P_NOWAIT, path, args)
等效于
Popen([path] + args[1:])

關于環境變量的例子

os.spawnlpe(os.P_NOWAIT, “/bin/mycmd”, “mycmd”, “myarg”, env)
等效于
Popen(["/bin/mycmd", "myarg"], env={“PATH”: “/usr/bin”})

代替os.popen(), os.popen2(), os.popen3()

pipe = os.popen(“cmd”, ‘r’, bufsize)
等效于
pipe = Popen(“cmd”, shell=True, bufsize=bufsize, stdout=PIPE).stdout

pipe = os.popen(“cmd”, ‘w’, bufsize)
等效于
pipe = Popen(“cmd”, shell=True, bufsize=bufsize, stdin=PIPE).stdin

(child_stdin, child_stdout) = os.popen2(“cmd”, mode, bufsize)
等效于
p = Popen(“cmd”, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdin, child_stdout) = (p.stdin, p.stdout)

(child_stdin, child_stdout, child_stderr) = os.popen3(“cmd”, mode, bufsize)
等效于
p = Popen(“cmd”, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr)

(child_stdin, child_stdout_and_stderr) = os.popen4(“cmd”, mode, bufsize)
等效于
p = Popen(“cmd”, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)

*nix下,os.popen2, os.popen3, os.popen4 也可以接受一個列表做為執行的命令,這時參數會被直接傳給程序,而不經過shell的解釋轉換。如下:

(child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, bufsize)
等效于
p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE)
(child_stdin, child_stdout) = (p.stdin, p.stdout)

返回值處理:

pipe = os.popen(“cmd”, ‘w’)

rc = pipe.close()
if rc != None and rc % 256:
print “There were some errors”
等效于
process = Popen(“cmd”, ‘w’, shell=True, stdin=PIPE)

process.stdin.close()
if process.wait() != 0:
print “There were some errors”

代替popen2模塊里的函數:

(child_stdout, child_stdin) = popen2.popen2(“somestring”, bufsize, mode)
等效于
p = Popen(["somestring"], shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)

*nix下,popen2 也可以接受一個列表做為執行的命令,這時參數會被直接傳給程序,而不經過shell的解釋轉換。如下:

(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
等效于
p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)

popen2.Popen3 and popen2.Popen4 基本上也能用 subprocess.Popen 代替,除了以下幾點要注意:

    • 執行失敗的時候Popen會拋出異常
    • capturestderr參數用stderr代替
    • stdin=PIPEstdout=PIPE 必須要指定
    • popen2默認會關掉所有文件描述符,而Popen要指定close_fds=True

 部分內容轉載于http://hi.baidu.com/u_chen/item/fbb839f2fdc6c713a629889e


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩中文字幕在线| 精品中文字幕在线2019| 亚洲国产精品久久精品怡红院| 中文字幕av日韩| 国产第一区电影| 欧美黑人性生活视频| 日韩精品免费在线播放| 日韩亚洲欧美成人| 一区二区三区视频免费在线观看| 欧美日韩爱爱视频| 日韩在线观看高清| 理论片在线不卡免费观看| 亚洲国产精品国自产拍av秋霞| 欧美大肥婆大肥bbbbb| 欧美xxxx做受欧美.88| 91成人国产在线观看| 国产精品久久久久av| 久久久久久国产精品| 久久99国产精品自在自在app| 欧美性感美女h网站在线观看免费| 亚洲人成电影网站色| 亚洲精品福利视频| 91日本视频在线| 57pao成人国产永久免费| 国产不卡一区二区在线播放| 成人黄色av网站| 欧美日韩美女在线观看| 久久精品99久久香蕉国产色戒| 午夜免费在线观看精品视频| 2018中文字幕一区二区三区| 亚洲欧美日韩中文在线制服| 欧美电影免费观看高清完整| 国产欧美一区二区三区久久人妖| 欧美视频13p| 国产精品九九九| 国产精品成人一区| 中文字幕自拍vr一区二区三区| 亚洲欧美日韩中文视频| 亚洲va欧美va国产综合剧情| 国产福利精品av综合导导航| 91精品久久久久久久久久入口| 久久久久久噜噜噜久久久精品| 国产精品99久久久久久白浆小说| 欧美另类第一页| 亚洲精品资源在线| 97碰碰碰免费色视频| 国产成人一区二区| 亚洲图片在区色| 欧美午夜性色大片在线观看| 狠狠干狠狠久久| 日韩有码在线观看| 91精品免费看| 欧美成人免费在线视频| 午夜精品一区二区三区av| 日韩精品视频在线免费观看| 另类少妇人与禽zozz0性伦| 欧美国产日韩在线| 久久久国产一区| 日本中文字幕不卡免费| 亚洲国产精品99| 欧美成人精品在线观看| 国产精品视频地址| www.欧美视频| 国产成人综合亚洲| 日韩在线欧美在线| www.亚洲一区| 欧美日韩在线另类| 一区二区三区四区在线观看视频| 亚洲一区二区三| 国产在线精品一区免费香蕉| 亚洲综合自拍一区| 国产亚洲精品91在线| 欧美尺度大的性做爰视频| 国产日韩在线一区| 午夜精品久久久久久久99热浪潮| 欧美成人中文字幕在线| 亚洲黄色av女优在线观看| 国产精品爽爽爽爽爽爽在线观看| 在线免费观看羞羞视频一区二区| 欧美黑人一级爽快片淫片高清| 少妇高潮久久77777| 国产精品视频在线观看| 欧美性资源免费| 98视频在线噜噜噜国产| 秋霞av国产精品一区| 欧美黄色免费网站| 成人h视频在线| 国产一区二区三区免费视频| 日韩中文字幕免费| 亚洲欧美日韩国产中文专区| 中文字幕亚洲欧美一区二区三区| 国产精品视频地址| 北条麻妃在线一区二区| 黑人极品videos精品欧美裸| 中文字幕日韩精品在线| 高跟丝袜一区二区三区| 亚洲欧美日韩精品久久奇米色影视| 国产精品第100页| 精品国产乱码久久久久久天美| 搡老女人一区二区三区视频tv| 亚洲精品美女久久久| 欧美一级淫片videoshd| 亚洲人成在线电影| 亚洲伊人一本大道中文字幕| 欧美巨乳在线观看| 成人免费淫片视频软件| 97成人超碰免| 51视频国产精品一区二区| 精品国产一区二区三区久久| 成人福利视频在线观看| 91美女高潮出水| 久久亚洲精品国产亚洲老地址| 国产精品一区二区电影| 国产日韩欧美日韩| 欲色天天网综合久久| 欧美成人精品在线观看| 久久福利视频网| 亚洲一区二区三区在线视频| 中文字幕亚洲欧美日韩在线不卡| 国产精品久久久久久久久久东京| 久久久久久18| 色偷偷综合社区| 欧美性极品xxxx娇小| 欧美日韩国产va另类| 日韩美女av在线| 一区二区三区美女xx视频| 国产又爽又黄的激情精品视频| 91九色单男在线观看| 91精品啪在线观看麻豆免费| 日韩欧美亚洲一二三区| 国产精品视频网站| 欧美日韩在线免费观看| 尤物精品国产第一福利三区| 一区二区三区四区精品| 色狠狠av一区二区三区香蕉蜜桃| 国产视频久久久久久久| 欧美极品少妇xxxxⅹ喷水| 狠狠久久五月精品中文字幕| 精品美女久久久久久免费| 精品久久久免费| 久久久精品影院| 97精品视频在线观看| 中文字幕国产亚洲| 91系列在线播放| 欧美国产日韩精品| 久久久国产成人精品| 热久久这里只有| 夜夜躁日日躁狠狠久久88av| 亚洲一区二区三区乱码aⅴ| 日韩欧美一区二区三区| 国产一区二区三区在线观看网站| 国产婷婷成人久久av免费高清| 成人有码在线播放| 美日韩精品视频免费看| 国产欧美最新羞羞视频在线观看| 国产日韩欧美91| 91av在线影院| 一夜七次郎国产精品亚洲| 欧美精品精品精品精品免费| 91欧美日韩一区| 国产激情视频一区| 欧美黑人视频一区| 7777精品视频| 亚洲欧洲国产伦综合|