Python,subprocess模組(補充)

來源:互聯網
上載者:User

標籤:err   定向   linux中   call   shel   mina   沒反應   兩種   rmi   

1.subprocess模組,前戲
res = os.system(‘dir‘) 列印到螢幕,res為0或非0
os.popen(‘dir‘) 返回一個記憶體對象,相當於檔案流
a = os.popen(‘dir‘).read() a中就存的是執行結果輸出了

Python2.7 commands模組 commands.getstatusoutput(‘dir‘)返回元祖,第一個元素為狀態0為成功,第二個為結果
windows上不好用,只是Linux好用




subprocess模組,替換os.system等

subprocess.run([‘df‘,‘-h‘]) 當參數傳,Python解析,如果有管道符就不行了
subprocess.run(‘df -h | grep sda1‘, shell=True) shell=True是指不需要Python解析,直接把字串給shell
Python3.5才出現subprocess.run
終端輸入的命令分為兩種:
輸入即可得到輸出,如:ifconfig
輸入進行某環境,依賴再輸入,如:Python

常用subprocess

沒有管道
retcode = subprocess.call([‘ls‘,‘-l‘]) 成功返回0,不成功返回非0
subprocess.check_call([‘ls‘,‘-l‘]) 執行成功返回0,執行錯誤拋異常
subprocess.getoutput(‘ls /bin/ls‘)接收字串格式命令,只返回結果
res = subprocess.check_output([‘ls‘,‘-l‘])執行成功返回執行結果,不成功出錯
subprocess.getstatsoutput(‘ls /bin/ls‘) 返回元祖(1,‘/bin/ls‘),第一個狀態,第二個結果

上面的方法,底層都是封裝subprocess.popen
例子
res = subprocess.popen(‘ifconfig | grep 192‘,shell=True)
res
<subprocess.popen object at ox7f2131a>
res.stdout.read()讀不出來
要讀出來要先輸出到標準輸出裡,先存到管道PIPE 再給stdout python和shell是兩個進程不能獨立通訊,必須通過作業系統提供的管道
用管道可以把結果存到stdin stdout stderr
subprocess.popen(‘ifconfig | grep 192‘,shell=True,stdout=subprocess.PIPE)
res.stdout.read()就可以讀出來了
subprocess.popen(‘ifconfig | gr1111ep 192‘,shell=True,stdout=subprocess.PIPE)
出錯會直接列印錯誤。想不列印錯誤可以stderr儲存stderr=subprocess.PIPE


poll() check if child process has terminated. returns returncode
---------
res=subprocess.popen("sleep 10;echo ‘hello‘", shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
執行的時候沒反應,不知道是卡主了還是執行完了
每次調subprocess執行Linux命令,都相當於啟動了一個新的shell,啟動新的進程,執行一次命令等結果
如果該命令要花半小時,不知道是卡主了還是執行完了,可以res.poll()返回none表示還沒有執行完,返回0表示執行完了
res.wait()等待結束然後返回0
----------
terminate()殺掉該進程,res.terminate()
wait() wait for child process to terminate. returns returncode attribute
communicate()等待任務結束 沒什麼用,用Python當參數,輸Python進入環境
stdin 標準輸入
stdout 標準輸出
stderr 標準錯誤
pid the process ID of the child process


-----可用參數
args: shell命令,可以是字串或者序列類型
bufsize:指定緩衝,0無緩衝,1 行緩衝,其他 緩衝區大小 負值 系統緩衝
stdin,stdout,stderr:標準輸入,輸出,錯誤控制代碼
preexec_fn:只在Unix平台下有效,用於指定一個可執行對象,它將在子進程運行之前被調用
close_sfs:在Windows平台下,如果close_sfs被設定為True,則新建立的子進程將不會繼承父進程的輸入、輸出、錯誤管道
所以不能將close_fds設定為True同時重新導向子進程的標準輸入、輸出與錯誤

shell:同上
cod:用於設定子進程的目前的目錄
env:用於指定子進程的環境變數。如果env=None,子進程的環境變數將從父進程中繼承
universal_newlines:不同系統的分行符號不同,True->同意使用\n
startupinfo與createionflags只在Windows下有效
將被傳遞給底層的createprocess()函數,用於設定子進程的一些屬性,
如:主視窗的外觀,進程的優先順序等


subprocess實現sudo自動輸入密碼
例如Python裡面執行sudo apt-get install vim (Linux裡面要輸入密碼)
linux中應該echo ‘123‘ | sudo -S iptables -L
python直接 subprocess.popen("echo ‘123‘ | sudo -S iptables -L",shell=True)

Python,subprocess模組(補充)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.