外部コマンドを起動する

「外部コマンドを起動する」の編集履歴(バックアップ)一覧に戻る

外部コマンドを起動する - (2008/04/08 (火) 17:37:45) のソース

前提条件
-今後os.popen2はsubprocessに置き換えられていくようなので、なるべくsubprocessを使う。
-linux,OSX,windows全部で使える手段が望ましい。


やりたいこと。
レンダラの起動です、当然ながら。
+ 別プロセスで起動。以下の理由のため、終了を待たない。
+ 標準出力結果を毎行リアルタイムにきちんとチェックする。エラーによっては強制終了。問題なければログに出す。
+ 標準出力、標準エラー両方まとめてしまう。
+ windowsのエラー報告ダイアログは抑止。さもないとVNCでイチイチつないで閉じるまで操作不能になってしまうし。

#code(){{
outptr = file(logFile, "a")
	
try:
        #エラー報告ダイアログ抑止用
        if sys.platform.startswith("win"):
            import ctypes
            SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN
            ctypes.windll.kernel32.SetErrorMode(SEM_NOGPFAULTERRORBOX);
            subprocess_flags = CREATE_NO_WINDOW
        else:
            subprocess_flags = 0

	currentSubprocess = subprocess.Popen(command,shell=False,
	stdout=subprocess.PIPE,
	sstderr=subprocess.STDOUT,
	creationflags=subprocess_flags)
	print 'started process pid ['+str(currentSubprocess.pid)+']'

	child_stdout= currentSubprocess.stdout
	for line in child_stdout:
		#errorチェックはここでする。
		outptr.write(line)

except Exception,e:	
	print 'Error! currentSubprocess['+str(currentSubprocess.pid)+']'# it will be 1
	print repr('Error...')
	return 0
}}

思った通りには動いてる。

注意点として、batの場合、中で他の外部コマンドを起動するときはcallで読んでもらわないと外部エラー出力が流れてこない。


[[参考>http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html]]

[[subprocessにおけるエラー報告ダイアログ抑止の参考>http://blogs.activestate.com/ericp/2007/11/supressing-the.html]]
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。