Sublime Text2からPythonコードをgeany_run_script.batっぽく実行。
OpenCVで複数namedWindowを使ったコードをSublime Text2から走らせるとなぜか最初のウィンドウが出てこないという奇妙なバグがあって、これのせいでSublime Text断念して、Geanyへ戻ったというエントリーを書いたばかりですが、自分でビルドしたoverviewプラグインがまだ不安定で二度ほどクラッシュしてしまったので、overviewは正式版のリリースを待った方がいいかもしれないので、Sublimeを再考してみました。
自分用のGeanyのRunスクリプトっぽいPythonビルドシステムをつくって差し替えればいいのではないかと思いついた。
SublimeのビルドシステムについてはUnofficial docを参考にした。
GeanyはPythonスクリプトを起動する度に動的にgeany_run_script.batという起動スクリプトを生成して、ここからPythonコードを起動する。strerrとかstroutとか全部このbatが走っているcmdにくるという仕様。簡単だが恐ろしく安定しているので理に適っていると思う。
geany_run_script.batの内容は以下の感じ。
python "your_script.py"
pause
del "%0"
pause
delのラインで自分自身を消しているので、基本的にはgeany_run_script.batというファイルはお目にかかれないが、たまに消し損ないがある。たぶんDropboxとかその辺が同期しようとしてファイルをロックしてしまうのではないかと推定。
これと同じようなことをbatでやればいいのだから第一引数の%1をpythonスクリプトへのパスにして、
C:\\Python27\\python.exe %1
とかやって、これをRunLikeGeany.batとかで保存。このバッチファイルをビルドシステムから呼び出したいので、
{
"cmd": ["C:/path/to/RunLikeGeany.bat", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
こんな感じの設定をpython-geany-style.sublime-buildとかの名前でSublimeのData/Packages/Userに保存しておけば新たなビルドシステムが登録される。
これで、Geanyと似たような動作が得られて、OpenCVの問題も一部解消した(ウィンドウが全部でた)。しばらくSublimeを試そう。。。
追記:このバッチファイルをつかっても、Sublimeがcmdとsubprocessモジュールのパイプで通信しながらstdoutを読み出しているっぽいけども、これがやたら遅れる。もともとビルドメッセージを取ってくるためのものなので遅くても問題ないからしょうがないが、なんとかパイプをフラッシュするタイミングを速くできないものか。やっぱGeanyがいいかも・・。
追記2:一番動作がGeanyのRunスクリプトに近くなるのは、
C:\\Python27\\python.exe %1
pause
というバッチをPythonスクリプトと同じフォルダにおいておいて、これにドラッグすると一応同じ動作になって、Pythonスクリプト終了してもpauseでcmdが生き残るのでエラーがあった場合は確認できる。
しかし、これでもまだ何度も繰り返すことを考えるとまだ面倒なのでAHKスクリプトでショートカットキーをSublimeに割り当てて、このバッチを呼び出すという荒業も考える。スマートな解決法ではないので最後の手段だな。
追記3:Sublimeの中でPythonのコンソールを持てるSublimeREPLというのを知って、つかってみたらすごかった。OpenCVの問題も解決し、さらにはコードセレクションをぽちぽちDreamPieに送っている私のAHKスクリプトを引退に追いやる勢い。Sublime恐るべし。Geanyとはユーザー数とエコシステムが違うなぁ。
追記4:REPLにLoadFileToReplを組み合わせたらかなりGeanyの実行環境に近づいてきて、これでGeanyから乗り換え完了かと思ったが、REPLはすごいんだけども、やっぱり複雑なことをすると変なことがおこったりもするようだ。multiprocessingモジュールとQueueをつかったスクリプト(https://gist.github.com/i-namekawa/a24709d92f890b541bb4)を走らせたらWorkerクラスが__main__に見つからないとかでエラー。Geanyで同じのを実行するとちゃんと動いた。REPLの特殊な環境が干渉してたぶんスクリプトの実行しているスコープに影響が出たっぽい。やっぱりGeanyのシンプルさと安定性はすごいのかも。
http://stackoverflow.com/a/23722631/566035
自分用のGeanyのRunスクリプトっぽいPythonビルドシステムをつくって差し替えればいいのではないかと思いついた。
SublimeのビルドシステムについてはUnofficial docを参考にした。
GeanyはPythonスクリプトを起動する度に動的にgeany_run_script.batという起動スクリプトを生成して、ここからPythonコードを起動する。strerrとかstroutとか全部このbatが走っているcmdにくるという仕様。簡単だが恐ろしく安定しているので理に適っていると思う。
geany_run_script.batの内容は以下の感じ。
python "your_script.py"
pause
del "%0"
pause
delのラインで自分自身を消しているので、基本的にはgeany_run_script.batというファイルはお目にかかれないが、たまに消し損ないがある。たぶんDropboxとかその辺が同期しようとしてファイルをロックしてしまうのではないかと推定。
これと同じようなことをbatでやればいいのだから第一引数の%1をpythonスクリプトへのパスにして、
C:\\Python27\\python.exe %1
とかやって、これをRunLikeGeany.batとかで保存。このバッチファイルをビルドシステムから呼び出したいので、
{
"cmd": ["C:/path/to/RunLikeGeany.bat", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
こんな感じの設定をpython-geany-style.sublime-buildとかの名前でSublimeのData/Packages/Userに保存しておけば新たなビルドシステムが登録される。
これで、Geanyと似たような動作が得られて、OpenCVの問題も一部解消した(ウィンドウが全部でた)。しばらくSublimeを試そう。。。
追記:このバッチファイルをつかっても、Sublimeがcmdとsubprocessモジュールのパイプで通信しながらstdoutを読み出しているっぽいけども、これがやたら遅れる。もともとビルドメッセージを取ってくるためのものなので遅くても問題ないからしょうがないが、なんとかパイプをフラッシュするタイミングを速くできないものか。やっぱGeanyがいいかも・・。
追記2:一番動作がGeanyのRunスクリプトに近くなるのは、
C:\\Python27\\python.exe %1
pause
というバッチをPythonスクリプトと同じフォルダにおいておいて、これにドラッグすると一応同じ動作になって、Pythonスクリプト終了してもpauseでcmdが生き残るのでエラーがあった場合は確認できる。
しかし、これでもまだ何度も繰り返すことを考えるとまだ面倒なのでAHKスクリプトでショートカットキーをSublimeに割り当てて、このバッチを呼び出すという荒業も考える。スマートな解決法ではないので最後の手段だな。
追記3:Sublimeの中でPythonのコンソールを持てるSublimeREPLというのを知って、つかってみたらすごかった。OpenCVの問題も解決し、さらにはコードセレクションをぽちぽちDreamPieに送っている私のAHKスクリプトを引退に追いやる勢い。Sublime恐るべし。Geanyとはユーザー数とエコシステムが違うなぁ。
追記4:REPLにLoadFileToReplを組み合わせたらかなりGeanyの実行環境に近づいてきて、これでGeanyから乗り換え完了かと思ったが、REPLはすごいんだけども、やっぱり複雑なことをすると変なことがおこったりもするようだ。multiprocessingモジュールとQueueをつかったスクリプト(https://gist.github.com/i-namekawa/a24709d92f890b541bb4)を走らせたらWorkerクラスが__main__に見つからないとかでエラー。Geanyで同じのを実行するとちゃんと動いた。REPLの特殊な環境が干渉してたぶんスクリプトの実行しているスコープに影響が出たっぽい。やっぱりGeanyのシンプルさと安定性はすごいのかも。
http://stackoverflow.com/a/23722631/566035
Ctrl
+ BでReplでPythonスクリプトを実行するためのビルド設定。