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

2021-06-22 11:52:25 字數 1957 閱讀 3511

一、簡單**

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