python中執行命令的3種方法小結

2021-10-10 16:33:36 字數 3342 閱讀 2990

目前我使用到的python中執行cmd的方式有三種:

1. 使用os.system("cmd")

特點是執行的時候程式會打出cmd在linux上執行的資訊。

import os

os.system("notepad")

2. 使用popen模組產生新的process

現在大部分人都喜歡使用popen。popen方法不會列印出cmd在linux上執行的資訊。的確,popen非常強大,支援多種引數和模式。使用前需要from subprocess import popen, pipe。但是popen函式有乙個缺陷,就是它是乙個阻塞的方法。如果執行cmd時產生的內容非常多,函式非常容易阻塞住。解決辦法是不使用wait()方法,但是也不能獲得執行的返回值了。

popen原型是:

subprocess.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)
引數bufsize:指定緩衝。

引數executable用於指定可執行程式。一般情況下我們通過args引數來設定所要執行的程式。如果將引數shell設為 true,executable將指定程式使用的shell。在windows平台下,預設的shell由comspec環境變數來指定。

引數stdin, stdout, stderr分別表示程式的標準輸入、輸出、錯誤控制代碼。他們可以是pipe,檔案描述符或檔案物件,也可以設定為none,表示從父程序繼承。

引數preexec_fn只在unix平台下有效,用於指定乙個可執行物件(callable object),它將在子程序執行之前被呼叫。

引數close_sfs:在windows平台下,如果close_fds被設定為true,則新建立的子程序將不會繼承父程序的輸入、輸出、錯誤管 道。我們不能將close_fds設定為true同時重定向子程序的標準輸入、輸出與錯誤(stdin, stdout, stderr)。

如果引數shell設為true,程式將通過shell來執行。

引數cwd用於設定子程序的當前目錄。

引數env是字典型別,用於指定子程序的環境變數。如果env = none,子程序的環境變數將從父程序中繼承。

引數universal_newlines:不同作業系統下,文字的換行符是不一樣的。如:windows下用』/r/n』表示換,而linux下用 『/n』。如果將此引數設定為true,python統一把這些換行符當作』/n』來處理。

引數startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的createprocess()函式,用 於設定子程序的一些屬性,如:主視窗的外觀,程序的優先順序等等。

subprocess.pipe
在建立popen物件時,subprocess.pipe可以初始化stdin, stdout或stderr引數,表示與子程序通訊的標準流。

subprocess.stdout
建立popen物件時,用於初始化stderr引數,表示將錯誤通過標準輸出流輸出。

popen的方法:

popen.poll()
用於檢查子程序是否已經結束。設定並返回returncode屬性。

popen.wait()
等待子程序結束。設定並返回returncode屬性。

popen.communicate(input=none)
與子程序進行互動。向stdin傳送資料,或從stdout和stderr中讀取資料。可選引數input指定傳送到子程序的引數。 communicate()返回乙個元組:(stdoutdata, stderrdata)。注意:如果希望通過程序的stdin向其傳送資料,在建立popen物件的時候,引數stdin必須被設定為pipe。同樣,如 果希望從stdout和stderr獲取資料,必須將stdout和stderr設定為pipe。

popen.send_signal(signal)
向子程序傳送訊號。

popen.terminate()
停止(stop)子程序。在windows平台下,該方法將呼叫windows api terminateprocess()來結束子程序。

popen.kill()
殺死子程序。

popen.stdin
如果在建立popen物件是,引數stdin被設定為pipe,popen.stdin將返回乙個檔案物件用於策子程序傳送指令。否則返回none。

popen.stdout
如果在建立popen物件是,引數stdout被設定為pipe,popen.stdout將返回乙個檔案物件用於策子程序傳送指令。否則返回 none。

popen.stderr
如果在建立popen物件是,引數stdout被設定為pipe,popen.stdout將返回乙個檔案物件用於策子程序傳送指令。否則返回 none。

popen.pid
獲取子程序的程序id。

popen.returncode
獲取程序的返回值。如果程序還沒有結束,返回none。

例如: 

p = popen("cp -rf a/* b/", shell=true, stdout=pipe, stderr=pipe)  

p.wait()  

if p.returncode != 0:  

print "error."  

return -1

3. 使用commands.getstatusoutput方法

這個方法也不會列印出cmd在linux上執行的資訊。這個方法唯一的優點是,它不是乙個阻塞的方法。即沒有popen函式阻塞的問題。使用前需要import commands。

例如:

status, output = commands.getstatusoutput("ls")
還有只獲得output和status的方法:

commands.getoutput("ls")  

commands.getstatus("ls")

python中執行shell命令的幾個方法

這篇文章主要介紹了python中執行shell命令的幾個方法,本文一共給出3種方法實現執行shell命令,需要的朋友可以參考下 最近有個需求就是頁面上執行shell命令,第一想到的就是os.system,如下 os.system cat proc cpuinfo 但是發現頁面上列印的命令執行結果 0...

python中執行shell命令的幾種方式

最近有個需求就是頁面上執行shell命令,第一想到的就是os.system,os.system cat proc cpuinfo 但是發現頁面上列印的命令執行結果 0或者1,當然不滿足需求了。嘗試第二種方案 os.popen output os.popen cat proc cpuinfo prin...

python中執行shell命令的幾個方法小結

最近有個需求就是頁面上執行shell命令,第一想到的就是os.system,複製 如下 os.system cat proc cpuinfo 但是發現頁面上列印的命令執行結果 0或者1,當然不滿足需求了。嘗試第二種方案 os.popen 複製 如下 output os.popen cat proc ...