あるプロセスが別のプロセスの出力を入力として受け取るsubprocess
場所を使用するパイプスキームがあります。p2
p1
p1 = subprocess.Popen("ls -al", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen("grep mytext - ", shell=True, stdin=p1.stdout, stdout=subprocess.PIPE)
result = p2.communicate()
p1
またはp2
、間違った入力や不正な形式のコマンドなど、さまざまな理由で失敗する可能性があります。
このコードp1
は、失敗しない場合は正常に機能します。どうすればこれを行うことができますか?また、具体p1
的にまたはp2
具体的に失敗したかどうかも確認できますか? 例:
# p1 will fail since notafile does not exist
p1 = subprocess.Popen("ls notafile", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen("grep mytext - ", shell=True, stdin=p1.stdout, stdout=subprocess.PIPE)
result = p2.communicate()
p2.returncode
ではないことを確認できますが、それは失敗したか、p1 が失敗した0
ことを意味する可能性があります。このパイプがうまくいかない場合に、失敗したか失敗したp2
かを具体的に確認するにはどうすればよいですか?p1
p2
p1.returncode
理想的で明白な解決策となるこれをどのように使用できるかわかりません。元:
p1 = subprocess.Popen("ls foo", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen("grep mytext - ", shell=True, stdin=p1.stdout, stdout=subprocess.PIPE)
# here, p2.returncode not defined yet since we didn't communicate()
assert(p2 is None)
r = p2.communicate()
# now p2 has a returncode
assert(p2.returncode is not None)
# ... but p1 does not!
assert(p1.returncode is None)
ここでリターンコードがどのように役立つかわかりませんか?
@abarnert のおかげで完全な解決策は次のようになります。
p1 = subprocess.Popen("ls -al", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen("grep mytext - ", shell=True, stdin=p1.stdout, stdout=subprocess.PIPE)
result = p2.communicate()
if p2.returncode != 0:
# something failed
if p1.wait() != 0:
# p1 failed...
else:
# p2 failed...
shell=True
psセキュリティに関する注意事項を知っています。