219:プロセスをフォークする
os モジュールの fork 関数を用います。フォークに失敗した場合、 OSError? 例外が送出されるようになっています。実際に使用するコードでは、これを捕まえるようにしておいてください。下記のコード例では try 文は省略しています。子プロセスの終了を待つには wait, waitpid 関数を使います。 Python 2.5 以降ならばより多くの情報を返す wait3, wait4 関数もあります。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import os
import sys
pid = os.fork()
if pid == 0:
print 'chiled process'
sys.exit()
os.wait()
print 'parent process'
print 'child process id: %d' % pid
wait, waitpid 関数の戻り値にはプロセス状態コードが含まれます。これを確認すれば終了した理由を調べることができます。 os モジュールにはそのための関数が用意されています。詳しくはリファレンスを参照してください。
子プロセスにて他のプログラムを実行するという場合、現在のプロセスを別のプロセスで置き換える os.exec* (execl, execv など複数あり)関数を用います。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import os
import sys
pid = os.fork()
if pid == 0:
os.execl('/bin/ls', '-l')
os.wait()
print 'parent process'
print 'child process id: %d' % pid
とはいえ、ただプログラムを立ち上げるだけならば subprocess モジュールで十分であることが多いです。
#!/usr/local/bin/python # -*- coding: utf-8 -*- import subprocess ps = subprocess.Popen(['ls', '-l']) ps.wait() print 'parent process'
あえて fork を使い、明示的にプロセスをフォークする機会というのは、複数プロセスを駆使するアプリ(Web サーバなど)の実装やデーモンプロセスの作成などに限られます。