這裡我們用Windows下的shell來舉例:
subprocess *
為了方便你理解,我們用一個很簡單的一段程式碼來說明:
# #可以看見我們利用Popen實例化了一個p,創建了子程式cmd.exe,然後我們給他的的Stdin(標準輸入流)Stdout(標準輸出流);同時使用了subprocess. PIPE 作為參數,這個是一個特殊值,用來表示這些通道要開放。 (在Python3.5,加入了run()方法來進行更好的操作)
#然後我們繼續##這些訊息是不是很眼熟?這都是cmd的標準輸出!
然後就會輸出這些:
我們剛剛所寫入的資訊"echo Hellwworlds\r\n"已經被寫入了,看起來確實成功了!
注意一下我們使用了p.stdin.
flush() 來對輸入快取區進行刷新,輸出的資訊也需要一個"\r\n",至少在Windows 系統下必須這樣做,否則只刷新(p.stdin.flush)的話是無效的;我們到底做了什麼?
我們成功的創建了子程式cmd.exe,並且寫入"echo Hellwworlds\r\n" ,然後cmd取得了並且執行,於是返回Hellwworlds,這就是一次很簡單的讀寫交互!更高級的使用
#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!\r\n".encode("GBK")) p.stdin.flush() time.sleep(1) #延迟是因为等待一下线程就绪 p.stdin.write("exit\r\n".encode("GBK")) p.stdin.flush() w.start()
很好很好,猜猜輸出什麼?
有很多換行的原因是cmd回傳的結果有換行,然後print輸出會加上一個換行,所以就換了兩行,你可以考慮使用 sys.stdout .write 來輸出,這樣就沒有附加的換行了
這樣的話,你可以製作一個基礎的讀寫了,那麼我們開始封裝吧。
封裝Pipe
# 不廢話了,直接上程式碼,如果你真的想學會的話,請認真自己讀讀代碼。110行
我們實作了將所有的流程集中在一個類別裡面,並且可以定義三個參數,退出回饋
函數