python如何啟動(dòng)cmd批處理文件
一、簡(jiǎn)單代碼
直接上代碼,理解起來(lái)還是比較簡(jiǎn)單,os的簡(jiǎn)單,控制力比較小,subprocess的可以將相應(yīng)的cmd輸出獲取到,便于進(jìn)一步分析運(yùn)行結(jié)果
#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%
運(yùn)行后輸出如下結(jié)果:
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
二、稍復(fù)雜的代碼
對(duì)于普通的應(yīng)用以上的代碼已經(jīng)足夠,若是批處理文件比較特別,比如啟動(dòng)的批處理帶有鍵盤(pán)輸入?yún)?shù),這樣上面的代碼就會(huì)出現(xiàn)問(wèn)題,如下的批處理文件:
- sam.bat
@echo off echo 顯示命令行參數(shù) %1% set /p ver=請(qǐng)輸入版本: echo 輸入的版本為:%ver%
此文件含有兩種參數(shù)輸入:
- 其一是命令行參數(shù)
- 其二是鍵盤(pán)輸入?yún)?shù)
要求用戶(hù)在執(zhí)行過(guò)程中輸入版本號(hào),若是用之前的代碼,
你會(huì)發(fā)現(xiàn)程序總是沒(méi)有輸入提示,而當(dāng)你輸入完成后,提示及結(jié)果會(huì)一并出來(lái)
究其原因是由于讀出來(lái)的數(shù)據(jù)readline()是以回車(chē)換行為標(biāo)志的
提示語(yǔ)句沒(méi)有提示換行,因此直到操作完成后才能讀取到提示文字
明白了原因:
改進(jìn)的方法也就出來(lái)了,每次只讀取單個(gè)字符并顯示,直到讀不到為止,print這樣的函數(shù)默認(rèn)換行并且立即輸出,必須加參數(shù)讓其按文件格式打印.另外,之前的數(shù)據(jù)轉(zhuǎn)換是一次性轉(zhuǎn)換,一般不會(huì)出現(xiàn)異常,單個(gè)字節(jié)讀取對(duì)于中文字而言轉(zhuǎn)換會(huì)出異常,必須專(zhuān)門(mén)進(jìn)行處理
以下為修改的代碼:
- 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)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python導(dǎo)出chrome書(shū)簽到markdown文件的實(shí)例代碼
python導(dǎo)出chrome書(shū)簽到markdown文件,主要就是解析chrome的bookmarks文件,然后拼接成markdown格式的字符串,最后輸出到文件即可。下面給大家分享實(shí)例代碼,需要的朋友參考下2017-12-12Python使用SciencePlots庫(kù)繪制學(xué)術(shù)圖表詳解
這篇文章主要介紹了Python使用SciencePlots庫(kù)繪制學(xué)術(shù)圖表,SciencePlots提供了一系列預(yù)設(shè)的科學(xué)繪圖樣式,能夠幫助研究人員輕松創(chuàng)建專(zhuān)業(yè)的學(xué)術(shù)圖表,需要的朋友可以參考下2025-04-04Python數(shù)據(jù)結(jié)構(gòu)與算法之完全樹(shù)與最小堆實(shí)例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之完全樹(shù)與最小堆,結(jié)合實(shí)例形式分析了Python完全樹(shù)定義及堆排序功能實(shí)現(xiàn)相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Django+python服務(wù)器部署與環(huán)境部署教程詳解
這篇文章主要介紹了Django+python服務(wù)器部署與環(huán)境部署教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03用Python實(shí)現(xiàn)校園通知更新提醒功能
今天小編就為大家分享一篇用Python實(shí)現(xiàn)校園通知更新提醒功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11在Python中關(guān)于中文編碼問(wèn)題的處理建議
這篇文章主要介紹了幾種在Python中關(guān)于中文編碼問(wèn)題的處理方法,包括在使用Unicode編碼時(shí)碰到的異常等,需要的朋友可以參考下2015-04-04