您好,登錄后才能下訂單哦!
怎么在python3中利用subprocess模塊實現腳本交互?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1、python3的默認字符串類型
Python 2.x 同時支持ASCII和 Unicode字符串,默認情況下是ASCII編碼。而 Python 3中這種支持剛好調換:Unicode現在變成了默認類型,而 ASCII 字符串現在稱為 bytes。 bytes 數據結構包含字節值,并且它
不應該再被視為一個字符串,因為它是一個包含數據的不可變字節數組
上面這句話出自《python核心編程》(第三版)。這造成了python2和python3的很大的不兼容性。就是很多方法在python2中可用,但是在python3中不可用。幸運的是python提供了解決這種問題的方法。
如果想把默認字符串轉換成bytes類型,既把Unicode變成ASCII
# 方法一 bytes("str",encoding="utf8") # encoding="utf8"參數不可省略 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"可省略,因為已經是默認參數 egg: "中國".encode(encoding="gbk") b'\xd6\xd0\xb9\xfa' "中國".encode(encoding="utf8") b'\xe4\xb8\xad\xe5\x9b\xbd' #上面兩種方法的意思是一樣的,就是按某種編碼的方式,將Unicode轉變成ASCII。其中utf8是Unicode碼的一種存儲類型或者實現類型(這個不是很清楚),常見的還有utf16等
如果想把bytes字符串轉換成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,因為pipe的默認出口是終端,所以這句等價于 :print(str) sys.stdin.readline() #從pipe讀入一行數據,因為pipe的默認入口是終端,所以這里可以從終端輸入數據 # 此外,需要注意的是這里的str使用unicode類型的字符串即可,不需要bytes類型的字符串
正式內容
建立文件src/main.py
import subprocess as sub import sys popen = sub.Popen("python ./test.py", stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE) #將輸入,輸出,錯誤都定向到新的pipe for line in sys.stdin: # 讀取終端輸入 popen.stdin.write(line.encode(encoding="utf8")) # 寫入pip,write的參數要是bytes類型 popen.stdin.flush() #必須 output = popen.stdout.readline() #從子進程讀取數據,讀到的結果是bytes類型 sys.stdout.write(bytes.decode(output)) # sys模塊stdout的參數要求是字符串,所以要解碼,相當于print(out)
建立文件src/test.py,
import sys while True: line = sys.stdin.readline() #讀取父進程寫入的內容 sys.stdout.write(line) #將讀到的內容返回給父進程,可喲用print代替 # 注意:子進程的內容是無法打印的,其輸出的任何信息都會發送給父進程,所以我們通過輸出判斷line變量是bytes類型還是unicode類型,但是根據上一個文件的sys.stdout.write(bytes.decode(output)語句可知應該是str類型。
補充知識:python中多進程子進程使用input()為什么運行會報EOFError
關于python3多進程中,子進程中從鍵盤錄入值,運行報錯問題。
在python中,主進程允許從鍵盤錄入值。而子進程是不允許的。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。