pythonのプログラム内におきまして、
sys.stdout.close()
や
p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE) p2 = subprocess.Popen(["grep", "txt"], stdin=p1.stdout, stdout=subprocess.PIPE) p1.stdout.close() output = p2.communicate()[0]
のようにclose()というものがあると思うのですが、
両者は同じものなのでしょうか?
後者ではclose()の行が無くても意図する動作は得られました。
また、その機能につきましても調べてみても適格な答えが見つかりませんでしたので
ご質問させていただきました。
よろしくお願いいたします。<(_ _)>
自分のためのメモ
# 指定したプログラム(orファイル)でファイルを開くのが、 # popen()、つまりpopen()は内部で新規のopen(, 'rb')のようなことをしている。 # openされた新規臨時ファイルには、渡されたプログラムの標準出力が書き込まれる。 # shファイルなどを渡されても同様それを実行した標準出力を書き込む。 # stdout引数にPIPEが指定されていると、作成されるインスの変数stdoutにそのファイルオブが # セットされる。 p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE) # バイナリモードの場合は読み込み(openのrb引数)はio.BufferedReaderファイルオブが返る。 print(p1.stdout) # <_io.BufferedReader name=4> ※バイナリ指定のファイルオブ # name=4の4は通常にopen()使用した際はファイル名になるので、popenが付けてるファイル名 # この数値は被ることがないようになっているようだ。 # 当然read()やreadline()などファイルオブが持つメソを使える。(同じオブだから当然) # ただしcommunicateなどはpopen独自のものだから、p1.communicate()のように使う。 # ファイルの利用が終われば close(ファイルオブのインスメソ)を使ってファイルオブジェクトを閉じる後処理をする。 # これをしなければどんなリスクがあるのかは、f.close()しない場合と全く同じこと。 p1.stdout.close() # close()した後にprint(p1.stdout.read())としても当然ValueError: read of closed file # ただし、seek(0)で元に戻して再度read()しようとしてみるとio.UnsupportedOperation: File or # stream is not seekable.になった。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/17 03:52