コマンドプロンプトからcygwinのシンボリックリンクなコマンドを実行することは不可能

あるいは、コマンドプロンプトpythonを実行するとKKCFUNCとかいうのが実行されて、pythonが実行できない問題の原因と解決法。

まとめ

pathにcygwinのbinディレクトリを追加すると激しく便利だけど、機構上の問題で、cygwin内部のシンボリックリンクなコマンド*1コマンドプロンプトから実行することは不可能。互換モードのプロンプトが起動してしまいます。
構造上の問題なので、使いたいコマンドはシンボリックではないものにしておく必要があります。

事象

プログラムメニューのコマンドプロンプトからでも、cmd.exeからでも一緒だけど、

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\hoge>python

と打つと

Microsoft (R) KKCFUNC バージョン 1.10
Copyright (C) Microsoft Corp. 1991,1993. All rights reserved.

KKCFUNC が組み込まれました.

マイクロソフトかな漢字変換 バージョン 2.51
(C)Copyright Microsoft Corp. 1992-1993

C:\DOCUME~1\HOGE>

というのが起動しちゃう!

python

と書いている箇所を

c:\Python25\python.exe

と、フルパスで書けば、正常にpythonが起動する。
なんでこんな挙動なのか、皆目見当もつかなかったので会社の偉い人に訊いたら、あっさり教えてくれました。もっと早く訊けばよかったかも。

原因

原因は複数重なっていました。

原因1 Windows pythonではなく、cygwin pythonを起動させようとしていた

コマンドプロンプトからでもcygwinのコマンド群が使えると便利なので、環境変数のpathにcygwinのbinディレクトリを追加しているのですが、pathに書く順番が

  1. C:\cygwin\bin;
  2. C:\Python25;

になっていたため、

python

とコマンドを打った場合に、cygwin上のpythonのほうを呼び出していました。

原因2 cygwinの/usr/bin/pythonはpython2.4.exeへのシンボリックリンク

cygwin上のpythonを呼ぶのはそれでもいいんですが、cygwinpythonコマンドは

/usr/bin/python -> python2.4.exe

というシンボリックリンクでした。
当然、Windowsにはシンボリックリンクはないですが、cygwinはそれを内部的に実現するための一助としてPIFファイルを利用しているそうです。
そして、PIFはWin16環境との互換性のためにあるファイルなので、互換モードのプロンプトが起動してしまう、とのことでした。

雑感

上記の通り、複数の原因が絡んでいましたが、フルパスじゃないとpythonが起動できない問題は、pathに書く順番を

  1. C:\Python25;
  2. C:\cygwin\bin;

に変更して、解決できました。
事象の説明をしただけで原因を一発で示せる、うちの会社の人はすごい。尊敬する。

*1:/usr/bin/python -> python2.4.exe みたいな