91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在python3中利用subprocess模塊實現腳本交互

發布時間:2020-12-07 15:16:28 來源:億速云 閱讀:175 作者:Leah 欄目:開發技術

怎么在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多進程中,子進程中從鍵盤錄入值,運行報錯問題。

怎么在python3中利用subprocess模塊實現腳本交互

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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湟源县| 邳州市| 开鲁县| 襄汾县| 米林县| 临西县| 淮安市| 家居| 克山县| 乌兰浩特市| 韶关市| 卓资县| 普兰县| 德惠市| 金溪县| 高淳县| 肇庆市| 宜君县| 上林县| 石屏县| 丽江市| 同德县| 洛隆县| 吉木乃县| 中超| 吴川市| 虹口区| 鹤庆县| 太仆寺旗| 汉阴县| 阳朔县| 宣恩县| 旌德县| 承德县| 什邡市| 河南省| 峨眉山市| 霍邱县| 松江区| 连山| 普格县|