python中執行cmd的方式

2022-08-28 20:57:12 字數 3481 閱讀 8617

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

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

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

[python]view plain

copy

print

?os.system("ls")  

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

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

popen原型是:

[python]view plain

copy

print

?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。

例如:[python]view plain

copy

print

?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。

例如:[python]view plain

copy

print

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

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

[python]view plain

copy

print

?commands.getoutput("ls")  

commands.getstatus("ls")  

python執行cmd命令

import os import subprocess import sys def directory route filename list os.listdir route 獲取指定目錄下的所有檔名,以列表形式返回 filecount for item in filename list pat...

python執行cmd命令

我們在做手機端自動化的時候有時候可能會遇到需要執行cmd命令完成用例,我們一起學習下,通過python指令碼執行cmd命令 其實說白了就是windows中執行一些命令的地方。我們通常可以使用os模組的命令進行執行cmd os.system 執行的命令 原始碼 我們可以看到os.system成功的把我...

用cmd的方式執行exe程式

在asp.net中呼叫process.start執行程式,需要設定執行iis程序使用者的許可權,比較麻煩,ms的站點上有一篇說明 估計頁面404 換種方法,可以先執行cmd.exe,然後以引數形式呼叫bat檔案即可,參考文章 get the full file path string strfile...