測試 python呼叫cmd命令三種方法

2022-05-14 20:03:12 字數 3696 閱讀 7679

目前我使用到的python中執行cmd的方式有三種
該方法在呼叫完shell指令碼後,返回乙個16位的二進位制數,低位為殺死所呼叫指令碼的訊號號碼,高位為指令碼的退出狀態碼,即指令碼中「exit 1」的**執行後,os.system函式返回值的高位數則是1,如果低位數是0的情況下,則函式的返回值是0×100,換算為10進製得到256。

如果我們需要獲得os.system的正確返回值,那使用位移運算可以還原返回值:

>>> n = os.system(test.sh)

>>> n >> 8

>>> 3

這是最簡單的一種方法,特點是執行的時候程式會打出cmd在linux上執行的資訊。使用前需要import os。

os.system("ls") 僅僅在乙個子終端執行系統命令, 而不能獲取命令執行後的返回資訊

這種呼叫方式是通過管道的方式來實現,函式返回乙個file-like的物件,裡面的內容是指令碼輸出的內容(可簡單理解為echo輸出的內容)。使用os.popen呼叫test.sh的情況:python呼叫shell指令碼,有兩種方法:os.system(cmd)或os.popen(cmd),前者返回值是指令碼的退出狀態碼,後者的返回值是指令碼執行過程中的輸出內容。實際使用時視需求情況而選擇。明顯地,像呼叫」ls」這樣的shell命令,應該使用popen的方法來獲得內容

popen(command [, mode='r' [, bufsize]]) -> pipe

tmp = os.popen('ls *.py').readlines()

現在大部分人都喜歡使用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)

引數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

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

status, output = commands.getstatusoutput("ls")  

還有只獲得output和status的方法:

commands.getoutput("ls")

commands.getstatus("ls")

winform呼叫cmd命令

string str console.readline system.diagnostics.process p new system.diagnostics.process p.startinfo.filename cmd.exe p.startinfo.useshellexecute false...

python呼叫cmd視窗執行命令或指令碼

此方法是用於解決pyinstaller打包失敗,或者打包成功但無法執行的情況 如果打包exe成功執行了,就別再往下看了 我的應用場景 pyinstaller jieba wordcloud打包成功,但是執行失敗,而且提示的錯誤已超出我的補救能力,故採用此下下策 1 放棄py檔案打包 2 新建py檔案...

C 呼叫CMD命令視窗

ms的cmd命令列是一種重要的操作介面,一些在c 中不那麼方便完成的功能,在cmd中幾個簡單的命令或許就可以輕鬆搞定,如果能在c 中能完成cmd視窗的功能,那一定可以使我們的程式簡便不少。下面介紹一種常用的在c 程式中呼叫cmd.exe程式,並且不顯示命令列視窗介面,來完成cmd中各種功能的簡單方法...