1. 程式人生 > >python再學習4 啟動cmd批處理檔案

python再學習4 啟動cmd批處理檔案

一、簡單程式碼

直接上程式碼,理解起來還是比較簡單,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

@echo off
echo 顯示命令列引數 %1%
set /p ver=請輸入版本:
echo 輸入的版本為:%ver%
此檔案含有兩種引數輸入,其一是命令列引數,其二是鍵盤輸入引數,要求使用者在執行過程中輸入版本號,若是用之前的程式碼,你會發現程式總是沒有輸入提示,而當你輸入完成後,提示及結果會一併出來,究其原因是由於讀出來的資料readline()是以回車換行為標誌的,提示語句沒有提示換行,因此直到操作完成後才能讀取到提示文字。

明白了原因,改進的方法也就出來了,每次只讀取單個字元並顯示,直到讀不到為止,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)