Python
 Computer >> コンピューター >  >> プログラミング >> Python

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でのみ動作する点に注意してください。

  1. Pythonの名前空間とは?仕組みとスコープの関係をわかりやすく解説

    Pythonにおける名前空間の基本名前空間(namespace)とは、変数名とオブジェクトを対応付ける仕組みであり、スコープ(名前の有効範囲)を実現するための基盤となるものです。Pythonでは、パッケージ、モジュール、クラス、関数、メソッドなど、それぞれが独自の「名前空間」を持ち、その中で変数名が解決されます。名前空間の生成と破棄関数やモジュール、パッケージが評価されて実行が始まると、そのための新しい名前空間が作成されます。これは「評価コンテキスト」と捉えると理解しやすいでしょう。そして、関数などの実行が終了すると、その名前空間は破棄され、そこに含まれていた変数も一緒に消えます。さらに、ロー

  2. Pythonの「%」演算子とは?文字列フォーマットの基本と使い方を解説

    Pythonの「%」演算子の役割 Pythonにおける「%(パーセント)」は、文字列フォーマット演算子(補間演算子)として機能します。「format % values」という形式で記述すると、フォーマット文字列内の変換指定子が、values側の要素によって置き換えられます。この仕組みは、C言語のsprintf()関数とよく似ています。 基本的な使い方:文字列の埋め込み 最もシンプルな例は、文字列の中に変数の値を埋め込むケースです。 >>> lang = Python >>> print %s is awesome! % lang Python is awe