「外部コマンドを起動する」の編集履歴(バックアップ)一覧はこちら
「外部コマンドを起動する」(2009/07/08 (水) 13:53:27) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
自分の状況では、この例がもっともフィットしました。
[[試験運用中なLinux備忘録>http://d.hatena.ne.jp/kakurasan/20080413/p1]]
[[O'REILLY>http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html]]
[[subprocessにおけるエラー報告ダイアログ抑止の参考>http://blogs.activestate.com/ericp/2007/11/supressing-the.html]]
----
py2exe内で外部プロセスを使うプログラムA.exeを作成、
プログラムBからプログラムAを外部プロセスとして呼ぶ場合、
一定量まで標準出力を呼んでからまとめて出す、ようなおかしな状況に。
readlineのバッファ量の設定と思ったのだが
[[Python Matrix Jp>http://python.matrix.jp/tips/compatibility/subprocess.html]]
プログラムA内でsys.stdout.flush()やsys.stdout.close()をよぶ、といった解決法がありそう。
[[subprocess -popen - reading stdout from child - hangs>http://bytes.com/forum/thread712353.html]]
[[西尾泰和のはてなダイアリー(Pythonで子プロセスの出力を読む)>http://d.hatena.ne.jp/nishiohirokazu/20080407/1207536676]]
[[西尾泰和のはてなダイアリー(子プロセスに標準入力と標準出力を中継)>http://d.hatena.ne.jp/nishiohirokazu/20080404/1207312557]]
*子プロセス以下をすべてkillしたい
subprocess.Popenに
preexec_fn= os.setsid
とオプション指定すると、サブプロセスがプロセスグループ(Process Group)のトップになるため
os.killpg(pgid, signal.SIGTERM)
したときに、親プロセスを巻き込まずにkillすることができます。
プロセス情報を操作するのはosモジュールの方にあります。
[[プロセスのパラメタ>http://www.python.jp/doc/release/lib/os-procinfo.html]]
Pythonではありませんが、Unixのプロセスについて分かりやすく説明されてます。
[[プロセス制御>http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC26]]
*spaceのあるパスでうまくいかない
#code(){{
path = 'C:/Documents and Settings/user'
cmd = ['C:/Program Files/TortoiseSVN/bin/SubWCRev.exe', path]
p = subprocess.Popen(
cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
}}
このpathの方にスペースがあると、コマンド自体、C:/Programまでと判断されてしまう?
解決法は、shell=Falseです。
自分の状況では、この例がもっともフィットしました。
[[試験運用中なLinux備忘録>http://d.hatena.ne.jp/kakurasan/20080413/p1]]
[[O'REILLY>http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html]]
[[subprocessにおけるエラー報告ダイアログ抑止の参考>http://blogs.activestate.com/ericp/2007/11/supressing-the.html]]
----
py2exe内で外部プロセスを使うプログラムA.exeを作成、
プログラムBからプログラムAを外部プロセスとして呼ぶ場合、
一定量まで標準出力を呼んでからまとめて出す、ようなおかしな状況に。
readlineのバッファ量の設定と思ったのだが
[[Python Matrix Jp>http://python.matrix.jp/tips/compatibility/subprocess.html]]
プログラムA内でsys.stdout.flush()やsys.stdout.close()をよぶ、といった解決法がありそう。
[[subprocess -popen - reading stdout from child - hangs>http://bytes.com/forum/thread712353.html]]
[[西尾泰和のはてなダイアリー(Pythonで子プロセスの出力を読む)>http://d.hatena.ne.jp/nishiohirokazu/20080407/1207536676]]
[[西尾泰和のはてなダイアリー(子プロセスに標準入力と標準出力を中継)>http://d.hatena.ne.jp/nishiohirokazu/20080404/1207312557]]
*子プロセス以下をすべてkillしたい
subprocess.Popenに
preexec_fn= os.setsid
とオプション指定すると、サブプロセスがプロセスグループ(Process Group)のトップになるため
os.killpg(pgid, signal.SIGTERM)
したときに、親プロセスを巻き込まずにkillすることができます。
プロセス情報を操作するのはosモジュールの方にあります。
[[プロセスのパラメタ>http://www.python.jp/doc/release/lib/os-procinfo.html]]
Pythonではありませんが、Unixのプロセスについて分かりやすく説明されてます。
[[プロセス制御>http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC26]]
*spaceのあるパスでうまくいかない
#highlight(python){{
path = 'C:/Documents and Settings/user'
cmd = ['C:/Program Files/TortoiseSVN/bin/SubWCRev.exe', path]
p = subprocess.Popen(
cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
}}
このpathの方にスペースがあると、コマンド自体、C:/Programまでと判断されてしまう?
解決法は、shell=Falseです。