python 3はsubprocessモジュールを介してスクリプトを呼び出し、スクリプトと対話する

2286 ワード

仕事の必要に応じて、問題のような機能を実現する必要があります.ネット上のブログを見ると、資料の多くはpython 2向けで、しかも不明なところが多いので、自分で調べた結果を整理して、ブログを書き直しました.

予備知識


1、python 3のデフォルト文字列タイプ
Python 2.xはASCIIとUnicode文字列を同時にサポートし、デフォルトではASCII符号化である.Python 3では、Unicodeがデフォルトタイプになり、ASCII文字列がbytesと呼ばれています.bytesデータ構造にはバイト値が含まれており、データを含む可変バイト配列であるため、文字列と見なすべきではありません.
上の言葉は「pythonコアプログラミング」(第3版)から出ています.これはpython 2とpython 3の大きな互換性をもたらした.多くの方法はpython 2で使用できますが、python 3では使用できません.幸いなことに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 

正式な内容


ファイルを作成します.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)

ファイルを作成するpy,
import sys

while True:
    line = sys.stdin.readline() # 
    sys.stdout.write(line) # , print 
   #  : , , line bytes unicode , sys.stdout.write(bytes.decode(output) str 。