Pythonで学ぶ「詳解 UNIXプログラミング」(その7) 第7章 プロセスの環境
7.1 終了ハンドラの例
import atexit def my_exit1(): print "first exit handler" def my_exit2(): print "second exit handler" atexit.register(my_exit2) atexit.register(my_exit1) atexit.register(my_exit1) print "main is done"
Python 2.6以降では、atexit.register()
をデコレータとして使用することもできる。
import atexit @atexit.register def my_exit1(): print "first exit handler" @atexit.register def my_exit2(): print "second exit handler" print "main is done"
7.2 コマンド行の全ての引数を標準出力にエコーする
import sys for i, arg in enumerate(sys.argv): print "argv[{0}]:{1}".format(i, arg)
7.3〜7.6 setjump/longjump
サンプル7.3〜7.6はsetjump()
とlongjump()
のサンプルだが、Pythonには存在しないため実装することはできない。例外処理のありがたみを噛みしめつつ、setjump()
もlongjump()
も忘れてしまおう。以下はC言語版をPythonの例外処理を用いて実装した例である。
def do_line(line): for tok in get_token(): if tok is TOK_ADD: cmd_add() elif ... def get_token(): ''' fetch next token from global line string.''' global line ... ... while True: line = raw_input() if not line: return try: do_line(line) except Exception, e: print "Error:", e
7.7 現在のリソースリミットを出力する
import resource rnames = ( 'RLIMIT_AS', 'RLIMIT_CORE', 'RLIMIT_CPU', 'RLIMIT_DATA', 'RLIMIT_FSIZE', 'RLIMIT_MEMLOCK', 'RLIMIT_NOFILE', 'RLIMIT_NPROC', 'RLIMIT_OFILE', 'RLIMIT_RSS', 'RLIMIT_STACK', 'RLIM_INFINITY') for name in rnames: try: soft, hard = resource.getrlimit(getattr(resource, name)) except ValueError: soft = hard = "n/a" else: if soft == -1: soft = "(infinity)" if hard == -1: hard = "(infinity)" print "{0:14} {1:>10}\t{2:>10}".format(name, soft, hard)