CygwinからPython for Windowsとpy2exeを使う

私は不得手なことは一切やらず、得意なことだけやるようにしている。
本田宗一郎

Windowsでpythonという場合、cygwin pythonかWindows python(Python for Windows)の選択肢があります。自分の場合、shell作業との相性からcygwin版のpythonを使っていますが、目的によってはWindows pythonを使いたい時もあります。ということで、WIndows pythonとcygwinの組み合わせ時の注意点などをメモっておきます。

Cygwin terminalからWindows Pythonを使うための設定

alias設定

Windows Pythonの標準インストールであれば、python本体はC:\Python27\python.exeがインストールされると思います(Python2.7の場合)。基本は、cygwin版pythonを使うので、ここにはパスを通さず.bashrcあたりにaliasだけ用意しておきます。
alias winpython='c/Windows/Python27/python.exe'

interactiveモードとprint問題

cygwin terminal (Mintty等)からWindows Pythonを使った時にまずハマるのが、出力問題DOSプロンプト以外からの起動だと、Windows Pythonはinteractiveモードとして認識してくれないのが原因のようです。

対策としては以下の方法があります。
  • interactive modeのoption(-i)付きで起動する。
    $ winpython -i
    
    [欠点] interactive実行の時はいいのですが、script指定で実行した後、プロンプトが残ってしまう

  • バッファリングを無効にする。
    (-uオプションをつけるか, 環境変数PYTHONUNBUFFEREDを設定する)
    $ export PYTHONUNBUFFERED=1
    $ winpython hoge.py
    
    または、
    $ winpython -u hogepy
    
    [欠点] interactiveモードには使えない

  • DOSプロンプト経由で実行する (cygstartを使う)
    $ cygstart /cygdrive/c/Windows/Python27/python.exe hoge.py
    
    [欠点] 実行すると終了するので、print内容確認したい時とかには向かない
全ての用途を満たすような解はなさそうなので、目的に応じてこのあたりを使い分けるのが良いかと思います。

(参考)

改行コードの違い

Windows Pythonとcygwin pythonを切り替えて使う際に、ひとつ注意点として改行コードの扱いの違いがあります。 Cygwin版がCR+LFとなるのに対して、Windows PythonはCRです。
print文等で自動付与される改行に加えて、明示的に'\n'で書いたものも違います。

・cygwin版の出力 (出力内容をodコマンドで確認)
$ python -c "print 'abc'" | od -c
00000000   a   b   c   \n
$ python -c "print 'abc\n'" | od -c
00000000   a   b   c   \n  \n

・Windows Pythonの出力 (出力内容をodコマンドで確認)
$ winpython -c "print 'abc'" | od -c
00000000   a   b   c   \r  \n
$ winpython -c "print 'abc\n'" | od -c
00000000   a   b   c   \r  \n  \r  \n

fileへwriteした時の改行の扱いも同じように違うので注意が必要です。

py2exeを使う

Cygwin pythonがあるのに、あえてWindows pythonを使う目的の一つ(個人的にはこれだけ)が、py2exeです。python scriptをexe形式に変換してくれる便利なしろものです。自分専用のscriptであれば、わざわざexe化する意味はないのですが、Windows用で、かつ、配布用のプログラムとなると、python環境不要なexeの方が何かと便利です。

上で書いたようなかたちで共存できているなら、py2exe使う時だけ、Windows Python呼び出すだけです。とはいえ、せっかくcygwin環境から使うので、Makefileも用意してあげましょう。

Makefile
PYTHON = /cygdrive/c/Python27/python.exe

TARGET = test.exe
SRC    = test.py
SETUP  = setup.py

dist/$(TARGET) : $(SRC) $(SETUP)
	$(PYTHON) $(SETUP) py2exe

clean:
	rm -rf dist build

setup.py
# -*- coding: utf-8 -*- 

from distutils.core import setup
import py2exe

option = {
    "compressed"    :    1    ,
    "optimize"      :    2    ,
    "bundle_files"  :    1
}

setup(
    options = {
        "py2exe"    :    option
    },
    console = [
        {"script"   :    "test.py"}
    ],

    zipfile = None
)

これらを対象のpyファイル(上の例ならtest.py)と同じディレクトリに置いてやればOKです。
py2exeの使い方やインストール等は以下あたりが参考になります。

ファイルが増えてくるとMakefile用意しておくとやっぱり便利です。

B009Z30HPG

【関連記事】
gnupackでCygwin導入した時に最初にすること
WindowsでCUI環境


【関連書籍】
GNU Make 第3版 Robert Mecklenburg 矢吹 道郎 (監訳)
エキスパートPythonプログラミング Tarek Ziade 稲田 直哉
初めてのPython 第3版 Mark Lutz 夏目 大
Dive Into Python 3 日本語版 Mark Pilgrim Fujimoto
Python クックブック 第2版 Alex Martelli Anna Martelli Ravenscroft David Ascher 鴨澤 眞夫



このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです
人気エントリ
最近の記事
本のおすすめ

4274065979

4844337858

482228493X

4904807057

4873114799


最近のコメント
Links
プロフィール
  • Author:proger
  • 組み込み関係で仕事してます
ブログ内検索