<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:16:16
        文檔

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法:這里我們用Windows下的shell來舉例: subprocess *為了方便你理解,我們用一個(gè)很簡(jiǎn)單的一段代碼來說明:可以看見我們利用Popen實(shí)例化了一個(gè)p,創(chuàng)建了子程序cmd.exe,然后我們給他的的Stdin(標(biāo)準(zhǔn)輸入流)Stdout(標(biāo)準(zhǔn)輸出流);同時(shí)使用了subproce
        推薦度:
        導(dǎo)讀詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法:這里我們用Windows下的shell來舉例: subprocess *為了方便你理解,我們用一個(gè)很簡(jiǎn)單的一段代碼來說明:可以看見我們利用Popen實(shí)例化了一個(gè)p,創(chuàng)建了子程序cmd.exe,然后我們給他的的Stdin(標(biāo)準(zhǔn)輸入流)Stdout(標(biāo)準(zhǔn)輸出流);同時(shí)使用了subproce
        這里我們用Windows下的shell來舉例:

         subprocess *

        為了方便你理解,我們用一個(gè)很簡(jiǎn)單的一段代碼來說明:

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        可以看見我們利用Popen實(shí)例化了一個(gè)p,創(chuàng)建了子程序cmd.exe,然后我們給他的的Stdin(標(biāo)準(zhǔn)輸入流)Stdout(標(biāo)準(zhǔn)輸出流);

        同時(shí)使用了subprocess.PIPE 作為參數(shù),這個(gè)是一個(gè)特殊值,用于表明這些通道要開放。(在Python3.5,加入了run()方法來進(jìn)行更好的操作)

        然后我們繼續(xù)

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        這些信息是不是很眼熟?這都是cmd的標(biāo)準(zhǔn)輸出!

        然后就會(huì)輸出這些:

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        我們剛剛所寫入的信息"echo Hellwworlds "已經(jīng)被寫入了,看起來確實(shí)成功了!

        注意一下我們使用了 p.stdin.flush() 來對(duì)輸入緩存區(qū)進(jìn)行刷新,輸出的信息也需要一個(gè) " ",至少在 Windows 系統(tǒng)下必須這樣做,否則只刷新(p.stdin.flush)的話是無效的;

        我們到底做了什么?


        我們成功的創(chuàng)建了子程序 cmd.exe,并且寫入"echo Hellwworlds " ,然后cmd獲取了并且執(zhí)行,于是返回 Hellwworlds,這就是一次很簡(jiǎn)單的讀寫交互!

        更高級(jí)的使用

        既然我們已經(jīng)可以簡(jiǎn)單的讀寫了,那么加點(diǎn)for和threading 吧,味道也許更佳喔~

        #run.py 
        
        from subprocess import * 
        import threading 
        import time
        
        p =Popen('cmd.exe',shell=True,stdin=PIPE,stdout=PIPE)
        
        def run():
         global p
         while True:
         line = p.stdout.readline() 
         if not line: #空則跳出
         break
         print(">>>>>>",line.decode("GBK"))
        
         print("look up!!! EXIT ===") #跳出
        
        
        w =threading.Thread(target=run)
        
        p.stdin.write("echo HELLW_WORLD!
        ".encode("GBK"))
        p.stdin.flush()
        time.sleep(1) #延遲是因?yàn)榈却幌戮€程就緒
        p.stdin.write("exit
        ".encode("GBK"))
        p.stdin.flush()
        
        w.start()

        很好很好,猜猜輸出什么?

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        有很多換行的原因是cmd返回的結(jié)果有換行,然后print輸出會(huì)加一個(gè)換行,所以就換了兩行,你可以考慮使用 sys.stdout.write 來輸出,這樣就沒有附加的換行了

        這樣的話,你可以制作一個(gè)基礎(chǔ)的讀寫了,那么我們開始封裝吧。

        封裝Pipe


        不廢話了,直接上代碼,如果你真的想學(xué)會(huì)的話,還請(qǐng)認(rèn)真自己讀讀代碼。

        110行

        我們實(shí)現(xiàn)了將所有的過程集中在一個(gè)類里面,并且可以定義三個(gè)參數(shù),退出反饋函數(shù),就緒反饋函數(shù)和輸出反饋函數(shù)。

        # -*- coding:utf-8 -*-
        
        import subprocess 
        import sys
        import threading
        
        class LoopException(Exception):
         """循環(huán)異常自定義異常,此異常并不代表循環(huán)每一次都是非正常退出的"""
         def __init__(self,msg="LoopException"):
         self._msg=msg
        
         def __str__(self):
         return self._msg
        
        
        
        class SwPipe():
         """
         與任意子進(jìn)程通信管道類,可以進(jìn)行管道交互通信
         """
         def __init__(self,commande,func,exitfunc,readyfunc=None,
         shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,code="GBK"):
         """
         commande 命令
         func 正確
        輸出反饋函數(shù) exitfunc 異常反饋函數(shù) readyfunc 當(dāng)管道創(chuàng)建完畢時(shí)調(diào)用 """ self._thread = threading.Thread(target=self.__run,args=(commande,shell,stdin,stdout,stderr,readyfunc)) self._code = code self._func = func self._exitfunc = exitfunc self._flag = False self._CRFL = " " def __run(self,commande,shell,stdin,stdout,stderr,readyfunc): """ 私有函數(shù) """ try: self._process = subprocess.Popen( commande, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr ) except OSError as e: self._exitfunc(e) fun = self._process.stdout.readline self._flag = True if readyfunc != None: threading.Thread(target=readyfunc).start() #準(zhǔn)備就緒 while True: line = fun() if not line: break try: tmp = line.decode(self._code) except UnicodeDecodeError: tmp = self._CRFL + "[PIPE_CODE_ERROR] <Code ERROR: UnicodeDecodeError> " + "[PIPE_CODE_ERROR] Now code is: " + self._code + self._CRFL self._func(self,tmp) self._flag = False self._exitfunc(LoopException("While Loop break")) #正常退出 def write(self,msg): if self._flag: #請(qǐng)注意一下這里的換行 self._process.stdin.write((msg + self._CRFL).encode(self._code)) self._process.stdin.flush() #sys.stdin.write(msg)#怎么說呢,無法直接用代碼發(fā)送指令,只能默認(rèn)的stdin else: raise LoopException("Shell pipe error from '_flag' not True!") #還未準(zhǔn)備好就退出 def start(self): """ 開始線程 """ self._thread.start() def destroy(self): """ 停止并銷毀自身 """ process.stdout.close() self._thread.stop() del self if __name__ == '__main__': #那么我們來開始使用它吧 e = None #反饋函數(shù) def event(cls,line):#輸出反饋函數(shù) sys.stdout.write(line) def exit(msg):#退出反饋函數(shù) print(msg) def ready():#線程就緒反饋函數(shù) e.write("dir") #執(zhí)行 e.write("ping www.baidu.com") e.write("echo Hello!World 你好中國!你好世界!") e.write("exit") e = SwPipe("cmd.exe",event,exit,ready) e.start()

        輸出:

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        你可以看見,我們的指令都順序的執(zhí)行了。當(dāng)然了這里面還有OS的功勞。

        那么你的可擴(kuò)展的Pipe類應(yīng)該已經(jīng)構(gòu)建完畢了吧?

        A: 我之所以要在這種代碼前面加入行數(shù)的原因就是為了防止你復(fù)制;因?yàn)槟憧赡苡肋h(yuǎn)不會(huì)明白這里究竟發(fā)生了什么,而是只懂得了使用。

        順便一提:

        最好去參考一下官方的文檔,已經(jīng)講得非常詳細(xì)了。subprocess.Popen.communicate 或許更適合你,看你是要進(jìn)行什么事情。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法

        詳解Python3利subprocess實(shí)現(xiàn)管道pipe交互操作讀/寫通信方法:這里我們用Windows下的shell來舉例: subprocess *為了方便你理解,我們用一個(gè)很簡(jiǎn)單的一段代碼來說明:可以看見我們利用Popen實(shí)例化了一個(gè)p,創(chuàng)建了子程序cmd.exe,然后我們給他的的Stdin(標(biāo)準(zhǔn)輸入流)Stdout(標(biāo)準(zhǔn)輸出流);同時(shí)使用了subproce
        推薦度:
        標(biāo)簽: 操作 管道 python
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲 综合 国产 欧洲 丝袜| 亚洲AV无码一区东京热久久| 一区免费在线观看| 亚洲国产精品无码久久一区二区 | 国产又大又粗又长免费视频| 亚洲日韩精品国产3区| 国产成人精品久久亚洲高清不卡 | 免费国产黄网站在线观看视频| 亚洲丶国产丶欧美一区二区三区 | 激情无码亚洲一区二区三区| 国产亚洲自拍一区| 中文字幕无码成人免费视频| 人人公开免费超级碰碰碰视频| 亚洲视频一区在线| 亚洲福利精品一区二区三区 | 亚洲国产无套无码av电影| 免费人成网站在线观看10分钟| 一级毛片a女人刺激视频免费| 亚洲乱码中文论理电影| 国内精品久久久久久久亚洲| 好先生在线观看免费播放 | 午夜影视在线免费观看| 在线观看免费无码视频| 亚洲sm另类一区二区三区| 夜夜亚洲天天久久| 国产性爱在线观看亚洲黄色一级片 | 黄页网站在线观看免费| 亚洲一线产区二线产区精华| 亚洲色WWW成人永久网址| 国产精品国产免费无码专区不卡 | 亚洲国产精品无码久久久秋霞2| 日日AV拍夜夜添久久免费| 久久精品一本到99热免费| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产免费人成视频尤勿视频| 亚洲日韩国产AV无码无码精品| 亚洲avav天堂av在线不卡| 亚洲精品亚洲人成在线观看下载| 女人毛片a级大学毛片免费| 91九色视频无限观看免费| 3344在线看片免费|