一、簡單**
直接上**,理解起來還是比較簡單,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=0byte_data = p.stdout.read(1)
p.wait()
print(p.returncode)
STM32再學習 啟動流程分析
我們寫嵌入式程式,基本上採用c語言來編寫,以main 作為程式的入口。但實際上,mian 並不是最先要執行的,在這之前需要做一些基本的工作,如堆 棧的定義 main函式的復位連線等,這些工作就需要乙個專門的啟動程 我們寫嵌入式程式,基本上採用c語言來編寫,以main 作為程式的入口。但實際上,mia...
PHP再學習4 slim框架學習和使用
slim是乙個簡單而又強大的php5框架,可以用來建立restful的web應用。可以借助slim框架設計乙個簡化版的yeelink平台。restful架構對物聯網非常重要,通過slim的學習也加深對restful框架和相關技術的理解。php學習筆記 索引博文 wampserver是一款由法國人開發...
Python正則之再學習與實踐
昨天做網頁爬取的時候,感覺自己對正則不熟悉的很,故今天再花上午時間認真整理下,不可懈怠。1.常見正規表示式符號 1 literal 匹配文字字串的字面值literal 2 re1 re2 匹配正規表示式re1或者re2 foo bar 3 匹配任何字元 除 n b.b 4 匹配字串的起始部分 dea...