溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在python3中利用subprocess模塊實(shí)現(xiàn)腳本交互

發(fā)布時(shí)間:2020-12-07 15:16:28 來(lái)源:億速云 閱讀:165 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

怎么在python3中利用subprocess模塊實(shí)現(xiàn)腳本交互?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

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提供了解決這種問(wèn)題的方法。

如果想把默認(rèn)字符串轉(zhuǎn)換成bytes類型,既把Unicode變成ASCII

# 方法一
bytes("str",encoding="utf8") # encoding="utf8"參數(shù)不可省略
egg:
 bytes("中國(guó)",encoding="gbk")
 b'\xd6\xd0\xb9\xfa'
 bytes("中國(guó)",encoding="utf-8")
 b'\xe4\xb8\xad\xe5\x9b\xbd'
#方法二
"str".encode(encoding="utf8") # encoding="utf8"可省略,因?yàn)橐呀?jīng)是默認(rèn)參數(shù)
egg:
 "中國(guó)".encode(encoding="gbk")
 b'\xd6\xd0\xb9\xfa'
 "中國(guó)".encode(encoding="utf8")
 b'\xe4\xb8\xad\xe5\x9b\xbd'
 
#上面兩種方法的意思是一樣的,就是按某種編碼的方式,將Unicode轉(zhuǎn)變成ASCII。其中utf8是Unicode碼的一種存儲(chǔ)類型或者實(shí)現(xiàn)類型(這個(gè)不是很清楚),常見(jiàn)的還有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")
 '中國(guó)'
 bytes.decode(b'\xd6\xd0\xb9\xfa',encoding="gbk")
 '中國(guó)'

2、sys模塊的stdout,stdin,stderr*

sys.stdout.write(str) #將字符串str寫(xiě)入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")) # 寫(xiě)入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)程寫(xiě)入的內(nèi)容
 sys.stdout.write(line) #將讀到的內(nèi)容返回給父進(jìn)程,可喲用print代替
 # 注意:子進(jìn)程的內(nèi)容是無(wú)法打印的,其輸出的任何信息都會(huì)發(fā)送給父進(jìn)程,所以我們通過(guò)輸出判斷l(xiāng)ine變量是bytes類型還是unicode類型,但是根據(jù)上一個(gè)文件的sys.stdout.write(bytes.decode(output)語(yǔ)句可知應(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ò)問(wèn)題。

怎么在python3中利用subprocess模塊實(shí)現(xiàn)腳本交互

在python中,主進(jìn)程允許從鍵盤錄入值。而子進(jìn)程是不允許的。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI