python3通過subprocess模塊調(diào)用腳本并和腳本交互的操作
因工作需要,需實(shí)現(xiàn)如題所示功能。查閱網(wǎng)上博客,資料,大多都是針對python2的,而且很多地方不明所以,所以自己整理了一下查閱的結(jié)果,重新寫一篇博客。
預(yù)備知識(shí)
1、python3的默認(rèn)字符串類型
Python 2.x 同時(shí)支持ASCII和 Unicode字符串,默認(rèn)情況下是ASCII編碼。而 Python 3中這種支持剛好調(diào)換:Unicode現(xiàn)在變成了默認(rèn)類型,而 ASCII 字符串現(xiàn)在稱為 bytes。 bytes 數(shù)據(jù)結(jié)構(gòu)包含字節(jié)值,并且它
不應(yīng)該再被視為一個(gè)字符串,因?yàn)樗且粋€(gè)包含數(shù)據(jù)的不可變字節(jié)數(shù)組
上面這句話出自《python核心編程》(第三版)。這造成了python2和python3的很大的不兼容性。就是很多方法在python2中可用,但是在python3中不可用。幸運(yùn)的是python提供了解決這種問題的方法。
如果想把默認(rèn)字符串轉(zhuǎn)換成bytes類型,既把Unicode變成ASCII
# 方法一 bytes("str",encoding="utf8") # encoding="utf8"參數(shù)不可省略 egg: bytes("中國",encoding="gbk") b'\xd6\xd0\xb9\xfa' bytes("中國",encoding="utf-8") b'\xe4\xb8\xad\xe5\x9b\xbd' #方法二 "str".encode(encoding="utf8") # encoding="utf8"可省略,因?yàn)橐呀?jīng)是默認(rèn)參數(shù) egg: "中國".encode(encoding="gbk") b'\xd6\xd0\xb9\xfa' "中國".encode(encoding="utf8") b'\xe4\xb8\xad\xe5\x9b\xbd' #上面兩種方法的意思是一樣的,就是按某種編碼的方式,將Unicode轉(zhuǎn)變成ASCII。其中utf8是Unicode碼的一種存儲(chǔ)類型或者實(shí)現(xiàn)類型(這個(gè)不是很清楚),常見的還有utf16等
如果想把bytes字符串轉(zhuǎn)換成Unicode類型
bytes.decode( bytes碼,encoding="編碼方式" ) # bytes碼的一般格式是 : b+字符串,如 b'abc' egg: bytes.decode(b'\xe4\xb8\xad\xe5\x9b\xbd',encoding="utf-8") '中國' bytes.decode(b'\xd6\xd0\xb9\xfa',encoding="gbk") '中國'
2、sys模塊的stdout,stdin,stderr*
sys.stdout.write(str) #將字符串str寫入pipe,因?yàn)閜ipe的默認(rèn)出口是終端,所以這句等價(jià)于 :print(str) sys.stdin.readline() #從pipe讀入一行數(shù)據(jù),因?yàn)閜ipe的默認(rèn)入口是終端,所以這里可以從終端輸入數(shù)據(jù) # 此外,需要注意的是這里的str使用unicode類型的字符串即可,不需要bytes類型的字符串
正式內(nèi)容
建立文件src/main.py
import subprocess as sub import sys popen = sub.Popen("python ./test.py", stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE) #將輸入,輸出,錯(cuò)誤都定向到新的pipe for line in sys.stdin: # 讀取終端輸入 popen.stdin.write(line.encode(encoding="utf8")) # 寫入pip,write的參數(shù)要是bytes類型 popen.stdin.flush() #必須 output = popen.stdout.readline() #從子進(jìn)程讀取數(shù)據(jù),讀到的結(jié)果是bytes類型 sys.stdout.write(bytes.decode(output)) # sys模塊stdout的參數(shù)要求是字符串,所以要解碼,相當(dāng)于print(out)
建立文件src/test.py,
import sys while True: line = sys.stdin.readline() #讀取父進(jìn)程寫入的內(nèi)容 sys.stdout.write(line) #將讀到的內(nèi)容返回給父進(jìn)程,可喲用print代替 # 注意:子進(jìn)程的內(nèi)容是無法打印的,其輸出的任何信息都會(huì)發(fā)送給父進(jìn)程,所以我們通過輸出判斷l(xiāng)ine變量是bytes類型還是unicode類型,但是根據(jù)上一個(gè)文件的sys.stdout.write(bytes.decode(output)語句可知應(yīng)該是str類型。
補(bǔ)充知識(shí):python中多進(jìn)程子進(jìn)程使用input()為什么運(yùn)行會(huì)報(bào)EOFError
關(guān)于python3多進(jìn)程中,子進(jìn)程中從鍵盤錄入值,運(yùn)行報(bào)錯(cuò)問題。
在python中,主進(jìn)程允許從鍵盤錄入值。而子進(jìn)程是不允許的。
以上這篇python3通過subprocess模塊調(diào)用腳本并和腳本交互的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決python3中os.popen()出錯(cuò)的問題
在本篇文章里小編給大家整理的是一篇關(guān)于解決python3中os.popen()出錯(cuò)的問題的相關(guān)內(nèi)容,有興趣的朋友們可以參考下。2020-11-11Python?JMESPath庫輕松操作JSON進(jìn)行數(shù)據(jù)查詢方法實(shí)例
這篇文章主要為大家介紹了Python?JMESPath庫輕松操作JSON方法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01python實(shí)現(xiàn)Zabbix-API監(jiān)控
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)Zabbix-API監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報(bào)錯(cuò)
這篇文章主要介紹了jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報(bào)錯(cuò),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04python使用wxpython開發(fā)簡單記事本的方法
這篇文章主要介紹了python使用wxpython開發(fā)簡單記事本的方法,涉及Python使用wxPython實(shí)現(xiàn)桌面圖形應(yīng)用程序的技巧,需要的朋友可以參考下2015-05-05Opencv-Python圖像透視變換cv2.warpPerspective的示例
今天小編就為大家分享一篇關(guān)于Opencv-Python圖像透視變換cv2.warpPerspective的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04python pandas最常用透視表實(shí)現(xiàn)應(yīng)用案例
透視表是一種可以對數(shù)據(jù)動(dòng)態(tài)排布并且分類匯總的表格格式,它在數(shù)據(jù)分析中有著重要的作用和地位,在本文中,我將為你介紹python中如何使用pandas包實(shí)現(xiàn)透視表的功能,以及一些常見的應(yīng)用案例2024-01-01Python實(shí)現(xiàn)二值掩膜影像去噪與邊緣強(qiáng)化方法詳解
這篇文章主要介紹了Python實(shí)現(xiàn)二值掩膜影像去噪與邊緣強(qiáng)化方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01