exeねばなりません

気が進まないんだよなぁこのネタ。

本日のこのネタの、結果的なゴールは「python スクリプトを exe にする」となってしまったので、最初に警告が必要なわけよ、どうしても。

「python スクリプトを exe にしたい」という場合、その人の狙いで考えられるのは、大きく3つ可能性がある:

  1. 速くしたい。スクリプトは遅いからだ!
  2. Python に依存しないプログラムにしたい。ワタシのユーザに Python をインストールする手間をかけさせたくない!
  3. 「EXE でなきゃヤダっ」と叫ばれちゃったよ困ったね。

1. と、それと多くの 2. では、これは「python を python ではない C コードにコンパートしてビルドする」という術がない限りは技術的には無理で、少なくともワタシはそういうものの存在を知らない。2. は実際は「python ランタイムを完全に抱え込んで配布する」ということが不可能ではないので「無理」というわけではなく、フリーのソフトウェアだと結構使われてたりはする(普通は libpython-xx.so、python-xx.dll などの「python コアランタイム」を同梱する形になる)。

今回の話は 3. 限定の話で、つまり「EXE でないっ、と叱られたっ、ので EXE で包みゃいーんでしょ」な話。

こういうの、世界を「Unix 的 vs Windows」で二分するなら、Windows でしか起こらない。Unix はユーザのログイン時に起動するシェルが「実行可能であるかどうか」を「ELFであるかどうか(あるいは a.out かどうか)」のような基準では決めてないので、たとえば:

gcc
1 #! /bin/sh -x
2 gcc "$@"

みたいなラッパースクリプトを書いたとして、「シェルそのものを除くあらゆる gcc をあてにするプログラム」にとって gcc そのものとなる。(特殊な方法を使わない限りは、シェルだけがこの事実を知ることになる。)

これが Windows で出来ない。というか、「MSYS や cygwin などの Unix もどき環境で動く、bash などの Unix もどきシェル」を前提にするなら出来るんだけれど、「みんな大好き MS DOS」は shebang なんか理解しないので、どこまでいっても「gcc.exe != gcc.sh」であり、ゆえに「gccがない!」への措置が「gccという名前をつけたスクリプトでまかなう」ということにはなりえない。

「MSYS や cygwin などの Unix もどき環境で動く、bash などの Unix もどきシェルを前提にする」場合に「EXEである必要なんかない」こともポイントでな。要は MSYS や cygwin のユーザは、「別に EXE になってても嬉しぅない」のね、普段は。

して、久しぶりに出くわしちゃったわけ。「EXE じゃないから起動出来ないんだもんね、ばーかばーか」てヤツが。うーん、普段やろうと思わんからなぁ、忘れてるぞ。して、ワタシは実は以前これについて触れてる。これね。ただし、「実際にやってみた例」は挙げてない。「これを参考にすれば出来るだろう」と言ったのみで。ので、改めて: pymsvcc.zip pymsvcc_0.0.2.zip

中身をみてもらうとわかるんだけど、ワタシの今日のニーズは「python を」ではなくて、bash シェルスクリプトの方だったんだよね。その「msvcc.sh」を、具体的には「CC=msvcc.sh」と出来なくて必要になった。当然「bash to exe」というほうが直接的だけど、python を経由する方が話が早い、てこと。

「インストール」つまり:

1 [me@host: ~]$ unzip pymsvcc.zip
2 [me@host: ~]$ cd pymsvcc
3 [me@host: pymsvcc]$ py -3 setup.py install

としないと EXE には出来ない、てのはまぁ、やりたいことに対しては理想とは程遠いのではあるけれど、残念ながらこれが一番手軽なのよね。依存物は setuptools のみだしね。

中に入れた README.txt には書いたけど、これで「インストール」したものは一切信頼しないで。無価値、とまでは言わないけど、ほとんど大多数の人々のニーズには合わないはずだから。「ただのサンプル」と思ってちょ。