国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
當前位置: 首頁 - 科技 - 知識百科 - 正文

詳解Python3利subprocess實現管道pipe交互操作讀/寫通信方法

來源:懂視網 責編:小采 時間:2020-11-27 14:16:16
文檔

詳解Python3利subprocess實現管道pipe交互操作讀/寫通信方法

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

 subprocess *

為了方便你理解,我們用一個很簡單的一段代碼來說明:

詳解Python3利subprocess實現管道pipe交互操作讀/寫通信方法

可以看見我們利用Popen實例化了一個p,創建了子程序cmd.exe,然后我們給他的的Stdin(標準輸入流)Stdout(標準輸出流);

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

然后我們繼續

詳解Python3利subprocess實現管道pipe交互操作讀/寫通信方法

這些信息是不是很眼熟?這都是cmd的標準輸出!

然后就會輸出這些:

詳解Python3利subprocess實現管道pipe交互操作讀/寫通信方法

我們剛剛所寫入的信息"echo Hellwworlds "已經被寫入了,看起來確實成功了!

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

我們到底做了什么?


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

更高級的使用

既然我們已經可以簡單的讀寫了,那么加點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) #延遲是因為等待一下線程就緒
p.stdin.write("exit
".encode("GBK"))
p.stdin.flush()

w.start()

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

詳解Python3利subprocess實現管道pipe交互操作讀/寫通信方法

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

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

封裝Pipe


不廢話了,直接上代碼,如果你真的想學會的話,還請認真自己讀讀代碼。

110行

我們實現了將所有的過程集中在一個類里面,并且可以定義三個參數,退出反饋函數,就緒反饋函數和輸出反饋函數。

# -*- coding:utf-8 -*-

import subprocess 
import sys
import threading

class LoopException(Exception):
 """循環異常自定義異常,此異常并不代表循環每一次都是非正常退出的"""
 def __init__(self,msg="LoopException"):
 self._msg=msg

 def __str__(self):
 return self._msg



class SwPipe():
 """
 與任意子進程通信管道類,可以進行管道交互通信
 """
 def __init__(self,commande,func,exitfunc,readyfunc=None,
 shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,code="GBK"):
 """
 commande 命令
 func 正確
輸出反饋函數 exitfunc 異常反饋函數 readyfunc 當管道創建完畢時調用 """ 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): """ 私有函數 """ 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() #準備就緒 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: #請注意一下這里的換行 self._process.stdin.write((msg + self._CRFL).encode(self._code)) self._process.stdin.flush() #sys.stdin.write(msg)#怎么說呢,無法直接用代碼發送指令,只能默認的stdin else: raise LoopException("Shell pipe error from '_flag' not True!") #還未準備好就退出 def start(self): """ 開始線程 """ self._thread.start() def destroy(self): """ 停止并銷毀自身 """ process.stdout.close() self._thread.stop() del self if __name__ == '__main__': #那么我們來開始使用它吧 e = None #反饋函數 def event(cls,line):#輸出反饋函數 sys.stdout.write(line) def exit(msg):#退出反饋函數 print(msg) def ready():#線程就緒反饋函數 e.write("dir") #執行 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實現管道pipe交互操作讀/寫通信方法

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

那么你的可擴展的Pipe類應該已經構建完畢了吧?

A: 我之所以要在這種代碼前面加入行數的原因就是為了防止你復制;因為你可能永遠不會明白這里究竟發生了什么,而是只懂得了使用。

順便一提:

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

詳解Python3利subprocess實現管道pipe交互操作讀/寫通信方法

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

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产福利91精品一区二区 | 骚b视频| 亚洲欧美综合视频 | 成人国产在线看不卡 | 在线免费观看国产 | 国产在线精品观看 | 日韩精品第一 | 国产一区二区三区免费 | 亚洲一区二区三区四区视频 | 欧美人一级淫片a免费播放 欧美精品专区免费观看 | 亚洲v日韩v欧美在线观看 | 欧美高清第一页 | 国产精品久久亚洲一区二区 | 国产精彩视频在线观看 | 成人精品视频在线观看完整版 | 一级毛片在线全部免费播放 | 日韩 欧美 亚洲 | 国内精品一区二区在线观看 | 亚洲一区二区成人 | 欧美日韩国产一区 | 久久66热re国产毛片基地 | 91视频免费看 | 国内在线观看精品免费视频 | a毛片在线| 久久亚洲不卡一区二区 | 在线精品福利 | 亚洲国产精品免费视频 | 影音先锋亚洲综合小说在线 | 国产欧美曰韩一区二区三区 | 一级成人毛片免费观看 | 精品日本一区二区三区在线观看 | 亚洲小视频在线 | 香蕉久久网| 在线免费视频国产 | 国产一区二区福利久久 | 精品在线免费观看 | 久久婷婷国产麻豆91天堂 | 国产亚洲精品a在线观看app | 91频道| 91在线免费看 | 青青国产成人久久激情91麻豆 |