Pythonで外部プロセスを実行し、その外部プロセスの標準入力を使って、Pythonから情報を与えたい。
例えば、以下のように外部プロセスcat -
に対して、text.txt
の内容をPython経由で、cat -
に渡したい。
cat - < test.txt
解決策
subprocess.Popen()で外部プロセスを起動し、Popen.communicate(input)を使って、外部プロセスの標準入力に値を渡せば良い。
以下は、cat -
に対して、標準入力からtest1\ntest2\ntest3
を渡している。
# spike.py
import subprocess
def main():
proc = subprocess.Popen(
"cat - ",
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)
stdout, stderr = proc.communicate("test1\ntest2\ntest3")
if stdout:
print("stdout:")
print(stdout)
if stderr:
print("stderr:")
print(stderr)
if __name__ == "__main__":
main()
実行結果は以下となる。
$ python spike.py
stdout:
test1
test2
test3
参考
- Popen コンストラクター このモジュー… # subprocess — サブプロセス管理 — Python 3.12.1 ドキュメント
- Popen.communicate(inp… # subprocess — サブプロセス管理 — Python 3.12.1 ドキュメント
- Pythonで外部プロセスと標準入出力で通信する #Python - Qiita
- python - Does subprocess.communicate() close stdin after writing input to it? - Stack Overflow
- 非同期に使う # Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ | DevelopersIO