MENU
やすひら
やすひらと申します。
長靴を履いたタヌキ(ITエンジニア)です。
モノ作りの楽しさを発信中。
X(旧Twitter)のフォローもお願いします。

[Python]子プロセス管理

Pythonでは、他のプログラムやシステムコマンドを実行することができます。
本記事では、subprocessを用いた子プロセスの管理を紹介します。

やすひら

子プロセス管理を紹介します

この記事でわかること
  • 子プロセスの管理方法
  • 子プロセスの実行方法
目次

子プロセスの実行

子プロセスを実行する方法を紹介します。

ソースコード

import subprocess

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

コマンド実行例

$ python3 -B python-subprocess-run.py
total 4
-rw-rw-r-- 1 user user 111 Oct  2 14:22 python-subprocess-run.py

run関数で子プロセスを実行できます。

子プロセスの非同期実行

非同期で子プロセスを実行する方法を紹介します。

ソースコード

import subprocess

process = subprocess.Popen(['sleep', '5'])
print("子プロセスを実行中...")
process.wait()  # プロセスが終了するまで待機
print("子プロセスが終了しました")

コマンド実行例

$ python3 -B python-subprocess-popen.py
子プロセスを実行中...
子プロセスが終了しました

Popen関数で、非同期で子プロセスを実行できます。
wait関数によりプロセスが終了するまで待機することもできます。

標準入力/標準出力のリダイレクト

プロセスの標準入力/標準出力をリダイレクトして、子プロセスにデータを渡すことができます。

ソースコード

import subprocess

process = subprocess.Popen(['grep', 'python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
output, _ = process.communicate(input='python\njava\n')
print(output)

コマンド実行例

$ python3 -B python-subprocess-popen-redirect.py 
python

リダイレクトで子プロセスにデータを渡しています。

子プロセスの実行(タイムアウトあり)

タイムアウトありで子プロセスを実行することができます。

ソースコード

import subprocess

try:
    result = subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:
    print("タイムアウトが発生しました")

コマンド実行例

$ python3 -B python-subprocess-run-timeout.py 
タイムアウトが発生しました

timeoutの引数にタイムアウト秒数を指定して、タイムアウトありで子プロセスを実行できます。

まとめ

Pythonの子プロセス管理について紹介しました。

Pythonの子プロセスは
  • subprocessで管理できる
  • 外部プロセスを実行できる
  • 非同期で実行できる
  • リダイレクトできる
  • タイムアウト指定で実行できる

子プロセス管理は、主にLinuxコマンド等の外部プロセスを実行する際に利用します。
Pythonから外部プロセスを実行できれば、実行可能な機能範囲が増えるので、ぜひ利用したい機能の1つです。

  • URLをコピーしました!
目次