Pythonのos.pipe()関数とは?パイプによるプロセス間通信の基本を解説
Pythonのos.pipe()関数は、新しいパイプを作成し、読み取り用と書き込み用の2つのファイルディスクリプタからなるペア (r, w) を返します。この関数は主に、親プロセスと子プロセスの間でデータをやり取りするプロセス間通信(IPC)を実現するために使用されます。
os.pipe()の基本的な動作
- r(読み取り用ディスクリプタ): パイプからデータを読み出すために使用します。
- w(書き込み用ディスクリプタ): パイプへデータを書き込むために使用します。
パイプは一方通行のデータ通路であり、書き込まれたデータは先入れ先出し(FIFO)の順序で読み出されます。
サンプルコード:fork()との組み合わせ
以下の例では、os.fork()で生成した子プロセスがパイプにテキストを書き込み、親プロセスがその内容を読み取ります。
import os, sys
print("子プロセスがパイプにテキストを書き込み、")
print("親プロセスがそのテキストを読み取ります...")
# 読み書き用のファイルディスクリプタ r, w を取得
r, w = os.pipe()
processid = os.fork()
if processid:
# 親プロセス側の処理
os.close(w) # 書き込み用ディスクリプタは不要なので閉じる
r = os.fdopen(r) # ファイルオブジェクトに変換
print("親プロセス: 読み取り中")
text = r.read()
print("text =", text)
sys.exit(0)
else:
# 子プロセス側の処理
os.close(r) # 読み取り用ディスクリプタは不要なので閉じる
w = os.fdopen(w, 'w') # 書き込みモードでファイルオブジェクト化
print("子プロセス: 書き込み中")
w.write("子プロセスが書き込んだテキスト...")
w.close()
print("子プロセス: 終了")
sys.exit(0)
実行結果
親プロセス: 読み取り中 子プロセス: 書き込み中 子プロセス: 終了 text = 子プロセスが書き込んだテキスト...
コードのポイント
- os.fork(): 呼び出し元のプロセスを複製します。戻り値が0以外の場合は親プロセス、0の場合は子プロセスとして処理を分岐できます。
- os.fdopen(): 生のファイルディスクリプタをPythonのファイルオブジェクトにラップし、
read()やwrite()といった便利なメソッドを使えるようにします。 - 不要なディスクリプタを閉じる: 親プロセスでは書き込み側(w)を、子プロセスでは読み取り側(r)をそれぞれ閉じています。これにより、相手側がデータの終端(EOF)を正しく検知できるようになります。
なお、os.fork()はWindows環境では利用できず、このコードはLinuxやmacOSなどのUnix系OSでのみ動作する点に注意してください。
-
Pythonの名前空間とは?仕組みとスコープの関係をわかりやすく解説
Pythonにおける名前空間の基本名前空間(namespace)とは、変数名とオブジェクトを対応付ける仕組みであり、スコープ(名前の有効範囲)を実現するための基盤となるものです。Pythonでは、パッケージ、モジュール、クラス、関数、メソッドなど、それぞれが独自の「名前空間」を持ち、その中で変数名が解決されます。名前空間の生成と破棄関数やモジュール、パッケージが評価されて実行が始まると、そのための新しい名前空間が作成されます。これは「評価コンテキスト」と捉えると理解しやすいでしょう。そして、関数などの実行が終了すると、その名前空間は破棄され、そこに含まれていた変数も一緒に消えます。さらに、ロー
-
Pythonの「%」演算子とは?文字列フォーマットの基本と使い方を解説
Pythonの「%」演算子の役割 Pythonにおける「%(パーセント)」は、文字列フォーマット演算子(補間演算子)として機能します。「format % values」という形式で記述すると、フォーマット文字列内の変換指定子が、values側の要素によって置き換えられます。この仕組みは、C言語のsprintf()関数とよく似ています。 基本的な使い方:文字列の埋め込み 最もシンプルな例は、文字列の中に変数の値を埋め込むケースです。 >>> lang = Python >>> print %s is awesome! % lang Python is awe