python再學習4 啟動cmd批處理檔案
阿新 • • 發佈:2019-01-27
一、簡單程式碼
直接上程式碼,理解起來還是比較簡單,os的簡單,控制力比較小,subprocess的可以將相應的cmd輸出獲取到,便於進一步分析執行結果
#import os #os.system("c:\\sam.bat") import subprocess cmd = 'cmd.exe c:\\sam.bat' p = subprocess.Popen("cmd.exe /c" + "c:\\sam.bat abc", stdout=subprocess.PIPE, stderr=subprocess.STDOUT) curline = p.stdout.readline() while(curline != b''): print(curline) curline = p.stdout.readline() p.wait() print(p.returncode)
附上sam.bat檔案:
echo Hello world!
echo show %1%
執行後輸出如下結果:
b'\r\n'
b'c:\\Python34>echo Hello world! \r\n'
b'Hello world!\r\n'
b'\r\n'
b'c:\\Python34>echo show abc \r\n'
b'show abc\r\n'
0
二、稍複雜的程式碼
對於普通的應用以上的程式碼已經足夠,若是批處理檔案比較特別,比如啟動的批處理帶有鍵盤輸入引數,這樣上面的程式碼就會出現問題,如下的批處理檔案:
sam.bat
此檔案含有兩種引數輸入,其一是命令列引數,其二是鍵盤輸入引數,要求使用者在執行過程中輸入版本號,若是用之前的程式碼,你會發現程式總是沒有輸入提示,而當你輸入完成後,提示及結果會一併出來,究其原因是由於讀出來的資料readline()是以回車換行為標誌的,提示語句沒有提示換行,因此直到操作完成後才能讀取到提示文字。@echo off echo 顯示命令列引數 %1% set /p ver=請輸入版本: echo 輸入的版本為:%ver%
明白了原因,改進的方法也就出來了,每次只讀取單個字元並顯示,直到讀不到為止,print這樣的函式預設換行並且立即輸出,必須加引數讓其按檔案格式列印.另外,之前的資料轉換是一次性轉換,一般不會出現異常,單個位元組讀取對於中文字而言轉換會出異常,必須專門進行處理
以下為修改的程式碼:
sam.py
import subprocess
cmd = 'cmd.exe c:\\sam.bat'
p = subprocess.Popen("cmd.exe /c" + "c:\\sam.bat abc", stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
byte_data = p.stdout.read(1)
word_data = b''
while(byte_data != b''):
word_data += byte_data
try:
showdata = word_data.decode('gb2312')
print(showdata, end="", flush=True)
word_data = b''
except Exception as e:
#print(e)
a=0
byte_data = p.stdout.read(1)
p.wait()
print(p.returncode)