1. 程式人生 > 程式設計 >python3通過subprocess模組呼叫指令碼並和指令碼互動的操作

python3通過subprocess模組呼叫指令碼並和指令碼互動的操作

因工作需要,需實現如題所示功能。查閱網上部落格,資料,大多都是針對python2的,而且很多地方不明所以,所以自己整理了一下查閱的結果,重新寫一篇部落格。

預備知識

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中,主程序允許從鍵盤錄入值。而子程序是不允許的。

以上這篇python3通過subprocess模組呼叫指令碼並和指令碼互動的操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。