home changes contents help options

169:標準入出力をファイルにつなぎ換える

デフォルトの出力先をつなぎ換える

Python では標準入力、標準出力、標準エラー出力に対応するファイルオブジェクトとして sys.stdin, sys.stdout, sys.stderr が用意されています。

そして print 文、 raw_input 関数などはこれらのファイルオブジェクトを使用します。

つまり、 sys.stdout などに新たなファイルライクオブジェクトを代入することで print 文などの 出力先を変更することができます。

>>> import sys
>>> import os
>>> fo = open('spam.txt', 'w')
>>> sys.stdout = fo

なお、変更前の入出力先に戻す際には sys.__stdin__, sys.__stdout__, sys.__stderr__ に元の値が保持されているので これを代入してください。

>>> sys.stdout = sys.__stdout__

標準入力、標準出力、標準エラー出力をつなぎ換える

ほとんどの場合、 sys.stdout などを置き換えるだけで事足ります。 しかし、現在の Python のプロセスにおける、標準入出力を本当につなぎ換えることもできなくはありません。

このためには Python 上のファイルオブジェクト sys.stdout などに働きかけるのではなく、 I/O ストリームをファイルデスクリプタ(日本語版 Python ライブラリリファレンスでは「ファイル記述子」)で指定して直接操作する必要があります。

標準出力をつなぎ換えるには次のようにします。 この方法ならば os.system や subprocess.call など、子プロセスを生成する関数の動作にも影響を与えることができます。

>>> import sys
>>> import os
>>> fd = os.open('spam.txt', os.O_WRONLY|os.O_CREAT)
>>> os.dup2(fd, sys.stdout.fileno())

標準入力をつなぎ換えるのはこうです。

>>> import sys
>>> import os
>>> fd = os.open('egg.txt', os.O_RDONLY)
>>> os.dup2(fd, sys.stdin.fileno())

参考