とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

py2exeと秀丸エディタ

pythonにはスクリプト(.py)を実行ファイル(.exe)に固めるpy2exeというモジュールがあります。
py2exeで作った実行ファイルを秀丸から呼び出すときにはまったのでメモ。

問題点

py2exeで作った実行ファイル(foo.exe)を非表示にして起動しても、何故かコンソールウインドウが一瞬だけ表示されました。
foo.exeの実行結果は取得できますが、このままだと格好が悪いです。

runex "foo.exe"
      , 1             //sync    0:async 1:sync
      , 0, ""         //stdin   0:none 1:auto 2:file 3:(reserve) 4:all 5:select
      , 1, ""         //stdout  0:none 1:auto 2:file 3:add file  4:new 5:insert 6:replace
      , 0, ""         //stderr  0:none 1:=out 2:file 3:add file  4:new 5:insert 6:replace
      , 0, ""         //folder  0:none 1:current 2:specify 3:(reserve) 4:exe's folder
      , 2             //show    0:auto 1:show 2:hide
      , 1             //nodraw  0:draw 1:no draw
      , 0             //unicode 0:ansi 2:unicode
      ;

解決方法

試行錯誤の結果、cmd.exeで一段ラップしてやることでウインドウを非表示にして起動できました。

runex "cmd.exe /c foo.exe"
      , 1
      , 0, ""
      , 1, ""
      , 0, ""
      , 0, ""
      , 2
      , 1
      , 0
      ;

おまけ

runex関数に渡す実行ファイル名は短いパス名の方がいいときもあります。
パスの途中に空白文字があることを考慮していない大昔のプログラムを動かすときとか。

//短いパス名に変換する秀丸マクロの関数。
ConvertShortName:
    $$fn = $$1;
    ##fso = createobject("Scripting.FileSystemObject");
    ##obj = callmethod_returnobj(##fso,"Getfile",$$fn);
    $$short_name = getpropstr(##obj,"ShortPath");
    releaseobject(##fso);
    return $$short_name;