close_fds
Python27 で問題が発生したため、いくつかの調査を行った後、次の例を見つけました。
from subprocess import Popen, PIPE, STDOUT
p1 = Popen(['cat'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['grep', 'a'], stdin=p1.stdout, stdout=PIPE)
p1.stdin.write("aaaaaaaaaaaaaaaa\n")
p1.stdin.close()
p2.stdout.read()
私の問題は、なぜp1.stdin
開いたままなのか理解できないことです。p1
の子ではないp2
ため、明示的に渡されたもの以外のリソースをp2
継承するべきではありません。さらに、なぜ設定すると問題が解決するのですか? ここにこう書かれています。p1
p1.stdout
close_fds=True
p2
close_fds が true の場合、子プロセスが実行される前に、0、1、および 2 を除くすべてのファイル記述子が閉じられます。
したがって、 と の間の継承が理解できたとしてp1
も、標準入力 (1) であるため、閉じてはなりp2
ませp1.stdin
ん。close_fds=True