トップページ | Python 標準ドキュメント | 事例集 | アーティクル | リンク集 | ダウンロード | サイトマップ 
468x60サイズバナー・シリーズC Simple Fun and Indented
コンテンツ
Sorting Mini-HOWTO (和訳) - 組込みメソッド sort() を使ったソート方法を、いくつ...
pdb の使い方 -- 導入編 - デバッガの簡易な使い方です。
pdb の使い方 -- コマンド編 - デバッガコマンドのリファレンスです。
どこでもPython - 「フツーのISPでPythonが動かせる」mxCGIPyt...
正規表現 HOWTO - HOWTO プロジェクトから正規表現のチュートリアルを和訳...
py2exe (Windows 実行形式に変換) - Python スクリプトからスタンドアロンのWindows...
イテレータを使おう - Iterator/Generatorの基礎を簡単に解説して...
アーティクル
 
Python Powered
Powered by Zope
PyJUG網元衆










py2exe

Python スクリプトからスタンドアロンのWindowsプログラムへの変換

Copyright (C) 2001, 2002, Thomas Heller

**このドキュメントは py2exe バージョン 0.3.1 に対応した説明です. 最新のバージョンである 0.5.0 では,インタフェースがいくつか変更されていて,このページの サンプルが動作しません. py2exe 0.5.0 に関する説明は, こちら をご覧ください.**

概要

py2exeはPython スクリプトをスタンドアロンのWindows実行形式に変換する モジュールで,distutils の拡張として実装されている. py2exeを使って実行形式にしたプログラムは,Pythonをインストールせずに 実行することができるようになる(ランタイムDLLのインストールは必要).

現在の状態

py2exeは安定動作版になりつつある.py2exeはこれまで wxPython, Tkinter, Pmw, PyGTK, pygame, win32com client や他のスタンド アロンプログラムに利用されてきた.

この小さなユーティリティを試し,フィードバックを送ってくれた全ての 人々に感謝する.

py2exeはopen-source licenceで配布されている.

最新情報

作者のページ( http://starship.python.net/crew/theller/py2exe/)を参照.

py2exeの使い方

基本

例えばmyscript.py プログラムをPython処理系をインストールしなくても実行 できるWindows用のプログラムに変換したいとする. まだdistutilssetupスクリプトを書いていないなら,書いておく.スクリプト内でsetup関数を呼ぶ前にimport py2exeの1行を挿入する.

以下が単純な例である:


# setup.py
from distutils.core import setup
import py2exe

setup(name="myscript",
      scripts=["myscript.py"],
)

ここで,py2exe が機能するかどうか試してみる.


python setup.py py2exe --help

とすると,py2exeで利用可能なコマンドライン引数が出力される.

setup スクリプトを起動する.


python setup.py py2exe

setupスクリプトを起動したディレクトリの下にdist\myscript サブディレクトリが生成される.このディレクトリにはmyscript.exepythonXX.DLLが入っている. もし,コンパイル済みのC拡張モジュールや実行時に必要なDLLがスクリプトから 呼び出されていれば,それらのファイル群もこのディレクトリにコピーされる.

こうしてできたファイル群は,ターゲット計算機上にpythonがインストール されていなくてもプログラムを実行できるような必要なもの全てを含んでいる.

追加すべきファイルの指定

いくつかのアプリケーションは実行時に追加のファイルを必要とする.例えば 設定ファイルや,フォント,ビットマップなど.

py2exeでは,setupスクリプトにdata_filesオプションをつける ことで,これらのファイルをdist\myscriptサブディレクトリにコピー することができる. data_files(target-dir, files)のタプルからなる配列であり, filesはコピーされるべきファイルの配列となる.例えば,


# setup.py
from distutils.core import setup
import glob
import py2exe

setup(name="myscript",
      scripts=["myscript.py"],
      data_files=[("bitmaps",
                   ["bm/large.gif", "bm/small.gif"]),
                  ("fonts",
                   glob("fonts\\*.fnt"))],
)

この例ではbitmapsサブディレクトリがdist\myscriptの下に生成され, その下に2つのビットマップがコピーされる.サブディレクトリfontsの 下には全ての*.fntファイルが含まれる.

Windows NT servicesのビルド方法

--service classname 引数を使えば,py2exeでWindowsNT サービスをビルドすることもできる. classnaame はサービスを実装するクラスの名前に相当する. (これは通常win32serviceutil.ServiceFrameworkのサブクラスである) このクラスはメインスクリプトの中で実装されていなければならない.

サービスは通常の方法で「フリーズされた」アプリケーションとは 異なる方法で起動することに注意しなければならない:すなわち, スクリプトはスクリプトとして実行されるのではなく,まず実行ファイル 中に埋め込まれたあるCのコードによってimportされ,その後サービス クラスが起動される.

WindowsNTサービスはWindowsシステムによって登録されなければならないが, これは-register引数を指定して起動することで行える.この操作は サービスをデフォルトのオプション(ローカルシステムのアカウント権限で ログオンし,手動起動の設定)で登録する. -remove オプションで実行ファイルを起動することでサービスの登録を 解除できる.

通常サービスはWindowsによって起動/終了させられる(「サービス」 コントロールパネル参照).しかし,デバッグのために-debugオプションで サービスを起動してデバッグし,コンソール上でトレースバックを出力 することもできる.

サービスプログラムの サンプルSourceForgeから 入手できる.

バージョンリソース

通常,py2exeはバージョンリソースをsetupスクリプト内で与えたメタデータ (version, description, name)から構築する.バージョン番号の構築は バージョン番号文字列がドットで区切られた整数の形式を取るときのみ 成功する(つまり,'1.2.3' や '0.7' では成功するが,'1.2a3' や '5.7alpha' では失敗する).

この動作はdistutils の設定ファイルを変更することでカスタマイズできる. 普通設定ファイルの名前はsetup.cfgとされ,setupスクリプトの置かれている ディレクトリと同じディレクトリに置く.

以下のサンプルに有効なエントリの例を示す.


[py2exe]
version-companyname=Your company
version-legalcopyright=No copyright
version-filedescription = This is the description
version-fileversion = 1.0.0.1
version-legaltrademarks = The usual crap
version-productname = A Product? LOL!
version-productversion = 0.0.0.1

バージョン情報をコマンドラインから与えることはできない.

py2exeはどのように動作するのか?

py2exeはpythonのモジュールファインダを使ってスクリプトをロードし, 実行に必要な全てのPythonモジュールおよび拡張モジュールを探索する.ピュア Pythonモジュールは.pycまたは.pyoファイルにコンパイルされ, テンポラリディレクトリに出力される.また,コンパイルされた拡張モジュール (.pyd)も見つけ出し,バイナリ依存関係を解析する.

次にスクリプトのおかれたディレクトリの全てのファイルを含むzip互換の アーカイブが構築され,py2exeの提供するカスタムPythonインタプリタが 追加される.

結果として出力されたプログラムmyscript.exeを実行すると, importフックがインストールされ,zipファイルから必要なモジュールが インポートされた後スクリプトが起動する.

単純なケースでは,myscript.exe の他にpythonxx.dllが必要な だけとなる. しかし拡張モジュールが必要な場合には残念ながらファイルをzipアーカイブの 中に含めてimport することはできない.このため拡張モジュールは,別個の ファイルとして必要となる(dist\myscriptディレクトリにコピーされる).

注意:py2exeは全てのバイナリ依存関係を,distディレクトリにコピー された全てのpydとdllに対して追跡し.依存するファイルをdistディレクトリに 再帰的にコピーする.py2exeはコピー対象に含めないシステムDLL のファイルリストを持っているが,このリストは完全なものではない.

コマンドリファレンス

以下にpy2exeコマンドのコマンドラインオプションを示す( 最新のオプションリストはpython setup.py py2exe --help で表示 することができる):

--debug または -g

デバッグ情報を持ったランタイムを生成する.デフォルトではりリース ランタイムバイナリを生成する.デバッグ用ランタイムをビルドする際には, 全ての拡張モジュールでデバッグ用のバージョンが必要である.

--optimize または -O 0|1|2

最適化レベル.-O1は"python -O",-O2 は "python -OO" に相当する. -O0 は最適化を無効にする (デフォルト: -O0) .

--dist-dir または -d directory

生成されたファイル群を出力するためのディレクトリを指定する.

--force または -f

強制的に全てをリビルドする.

--keep-temp または -k

配布ファイルを生成した後,擬似インストールツリーを保持する.

--console

コンソールアプリケーションをビルドする.コンソールアプリケーションは python.exe を使ってスクリプトを実行するのと同様のインタフェースである. デフォルトでは処理するスクリプトの拡張子が.pyであるときにはコンソール アプリケーションを生成し,.pywであるときにはコンソールを必要としない GUIアプリケーションを生成する.

--windows または -w

windowsアプリケーションをビルドする.Windowsアプリケーションは pythonw.exeを使ってスクリプトを実行するのと同様のインタフェースである.

--service または -s classname

windows NTサービスをビルドする.windows NTサービスをビルドするには, サービスを実装しているクラスがスクリプト中に含まれていなくてはならない. また,そのクラス名をclassnameに指定しなくてはならない.

--excludes または -e list

ビルドに含めないモジュールのリストをカンマ区切りで指定する.

--includes または -i list

ビルドに含めるモジュールのリストをカンマ区切りで指定する.include オプションの内容はexcludeオプションの内容を上書きする.

--packages または -p list

ビルドに含めるパッケージのカンマ区切りのリスト.

--force-imports list

スクリプトを実行する前にsys.modulesに登録しておくモジュールのリストを カンマ区切りで指定する.

--icon ico-file

このオプションを使って実行ファイルのアイコンを指定できる. このオプションはWindowsNTまたはWindows2000でビルドを行うときのみ利用 できる.

以下のオプションは実装が計画されているが,まだ実装されていない:

--unbuffered または -u

標準入出力をバッファリングしないバイナリを生成する.

--unicode または -U

文字列リテラルをunicode文字列として扱う.

上記のオプションはコマンドラインでpy2exeを実行する際のオプションとして 用いるか,setup.cfg セットアップ設定ファイル中に記述することができる.

設定ファイルの詳細は distutilsのドキュメントに記載されている.

py2exeの動作に必要な事項

Python 1.5の場合

Distutils が必要である.最新バージョンは python.orgからダウンロードできる. py2exeはzip互換のアーカイブを構築するため,PATH上にzip.exe を置くか,Jim Ahlstromの zipfile-moduleがインストールされている必要がある.

Python 2.0 以降

すべてPythonディストリビューションに含まれている.

ダウンロードとプロジェクトに関する情報

作者はプロジェクトを sourceforge のファイルリリースシステムに移行したので, 全てのダウンロードは http://sourceforge.net/projects/py2exe/のfilesセクションから 行える.

バイナリ (windows installer)

バイナリ配布にはUninstallerも含まれている.py2exe の アンインストールはControl Panelから行える.(but you won't ;-).
For Python 2.2: py2exe-0.3.1.win32-py2.2.exe. 
For Python 2.1: py2exe-0.3.1.win32-py2.1.exe. 
For Python 2.0: py2exe-0.3.1.win32-py2.0.exe. 
For Python 1.5: py2exe-0.3.1.win32-py1.5.exe.

ソースコード

py2exe-0.3.1.zip.からダウンロードできる.

サンプルファイル

(まだ沢山あるわけではないが)

py2exe-samples0.3.1.zip.からダウンロードできる.

ホスティング

このプロジェクトは http://sourceforge.net/projects/py2exe/で ホスティングされている.

既知の問題

Unicode

最近のバージョンのPythonはUnicodeをサポートしており, encodingsパッケージを 実行ファイルに取り込む必要がある.このパッケージは標準では含まれておらず, py2exeからこのパッケージが必要かどうかを判別することは難しい. もしビルドされた実行ファイルの実行時に LookupError: no codec search functions registered: can't find encoding または, LookupError: unknowns encoding といったエラーが出力されるようなら,--packages encodings オプションをつけてpy2exeを実行すればよい.

Import関連のエラー

Pythonのmodulefinderはそこそこいい仕事をするが,たまに正しく依存関係を 追跡できないことがあるため,引数を与えてビルドプロセスをチューニングする 必要がある.

Modulefinder はバイトコード中のIMPORT命令をスキャンする.しかしながら, もし___import___ビルトイン関数の呼び出しを見つけることができなければ, 探索し,実行時に構築され,'exec'で実行されるimport文を探索する. ビルドされた実行ファイルの実行中にImportErrorが出力sれるなら, --includes オプションで見つけられないモジュール名を指定してリビルド するとよい.

2つ目の問題は他のPythonモジュールをimportするために( PyImport_Importを使う代わりに)PyImport_ImportModule 関数を用いている拡張モジュールである. この関数は我々のインストールしているimport-hookを使わないので,たとえ 必要なモジュールが利用可能な状態でもimportに失敗する.生成された実行 ファイルは Fatal Python Error:couldn't import 'module' などのメッセージを出力して失敗し,クラッシュすることもある.

この問題に対する解決法は--force-imports フラグを用いてリビルドする ことである.このフラグはスクリプトが起動する前に必要なモジュールが sys.modules に挿入されているよう保証するため,PyImport_ImportModule はこれらのモジュールをみつけられるようになる.

今後の課題

モジュール探索のためのよりアグレッシブな手法が必要である.: これにより,(おそらく)いくつかの難解なコマンドライン引数を廃止する ことができ,ビルド時に出力される警告メッセージを少なくすることができるだろう.

ローカル(exe) および inproc (dll) COM サーバをビルドできるようにする.

リンク

ASPN にはpy2exeを用いてローカルなCOMサーバを構築するための試験的な レシピ がポストされている. 別のポストにも書かれている.

関連製品

Fredrik Lundhの squeeze は "a simple utility which compiles your Python program into a bytecode package, allowing you do distribute Python programs as one or two files"(Pythonプログラムをバイトコードにパッケージ し,Pythonプログラムを1,2個のファイルで配れるようにするシンプルな ユーティリティ)である.

Christian Tismerの sqfreeze はsqueezeの初期のバージョンに基づいている.

Gordon McMillanの installerpy2exeに似ているが,Linux上でも動作する.


印刷用ページ
Copyright © 2001-2009 Python Japan User's Group.

警告当サイトの文書・画像等のコンテンツの著作権は、各コンテンツの作成者、もしくは日本Pythonユーザ会に帰属します。
 また、日本Pythonユーザ会はサイト内のコンテンツに他のプログラミング言語からの乗り換えを誘発する恐れのある表現が多々あることを認め、予めお詫び申し上げます。