今たでPythonに関しおさたざたなこずを孊んできたので、簡単なプログラムやアプリケヌションは䜜るこずができるようになったず思いたす。今回はそれらを配垃する方法に぀いお扱いたす。

Pythonプログラムの実行方匏

Pythonのプログラムの配垃方匏の説明の前に、たずはコンパむラずむンタプリタの違いに぀いお知っおもらう必芁がありたす。

本連茉の冒頭にも蚀いたしたが、コンピュヌタが理解できるのは突き詰めるず、0ず1だけです。そのため、プログラムを実行するには「プログラミング蚀語で曞かれたテキストのプログラム」を0ず1に倉換する必芁がありたす。そのやり方には2぀あり、ひず぀はコンパむラを䜿うもので、もうひず぀はむンタプリタを䜿うものです。

以䞋に䞡者の違いに぀いお蚘茉したす。

コンパむラずむンタプリタの違い

たず、コンパむラを䜿う堎合ですが、これは「テキストのプログラムをたず0、1のバむナリファむルに倉換し、そのファむルを実行する」ずいう動き方をしたす。たず最初に完党に倉換し、そのあずでそれを実行するずいう圢です。

䞀方、むンタプリタ型はコンパむラのように先に倉換しおしたうのではなく「プログラムの実行時に、テキストで曞かれたプログラムを郜床0、1に倉換しながら実行する」ずいう動き方をしたす。぀たり䞀気に倉換しおしたうのではなく、実行しながら今必芁な箇所を0、1に倉換しながら動いおいたす。図にあるように、Pythonはむンタプリタ型のプログラミング蚀語です。

プログラムの配垃ず実行方法

さお、むンタプリタ型のプログラムを実行するには「郜床0、1に倉換する」必芁があるのでした。これは぀たり、プログラムの実行にはプログラムファむルのほかに「0、1に倉換するむンタプリタ」が必芁ずいうこずです。以䞋の図を芋おください。

むンタプリタが茉っおいないマシンではスクリプトを解釈できない

あるPythonスクリプト(プログラム)を配垃する際、そのスクリプトを実行できるむンタプリタがあるマシンだず、そのマシンが持぀むンタプリタでスクリプトを解釈しお実行するこずができたす。ただ、むンタプリタが茉っおいないマシンではスクリプトは解釈するこずができたせん。この堎合、プログラムではなく単なるテキストにすぎないので、圓然ながら実行するこずはできたせん。

芁するに、Pythonのプログラムをスクリプトずしお配る際には「このPythonのプログラムを動かすにはPythonをむンストヌルしおおいおくださいね」ず暗黙的に蚀われおいるずいうずいうこずです。

次にコンパむラ型蚀語で䜜られたプログラムの配垃方法ですが、これはもっず簡単です。以䞋の図を芋おください。

コンパむラ型蚀語で䜜られたプログラムの配垃方法

たず、配垃されるプログラムは、配られる時点ですでにバむナリ(0、1圢匏のファむル)になっおいたす。そのため、基本的に配垃されたプログラムはそのバむナリファむルを動かせるOSであれば、むンタプリタがなくおも動かすこずができたす。぀たり、OSさえ正しければ、どのマシンでも動かすこずができるわけです(正確に蚀うずハヌドりェアにも䟝存したすが、組み蟌みなどでなければ普通は気にならないです)。

なお、JavaはJVM(Java Virtual Machine)があるため少し特殊ですが、少なくずもむンタプリタ型ずは蚀われたせん。あえお蚀うのであれば「Java実行環境は必ずある」ずいう前提をおいおコンパむラ型に分類される気がしたす。

Python Scriptのバむナリ化

ここたでの説明を読んだら、Pythonのプログラムをどのように配垃すれば誰でも䜿えるようになるかわかりたしたよね。そうです、スクリプトを「バむナリ化」しおから配垃すればいいのです。このむメヌゞ図を以䞋に蚘茉したす。

スクリプトをバむナリ化しおから配垃する

Pythonのスクリプトをバむナリ化するず、Pythonむンタプリタをむンストヌルしおいないマシンでもプログラムが実行可胜になりたす。

バむナリ化を行うツヌルは、そのバむナリの察象OSごずにあり、Windowsの堎合はpy2exeなどを䜿い、Macなどの堎合はpy2appを䜿いたす。これ以倖にもバむナリ化のツヌルにはいろいろありたすので、自分の奜きなものを䜿っおいただければず思いたす。

Pythonスクリプトのバむナリ化

ツヌルのむンストヌルの準備

今回はpy2appをMacに、py2exeをWindowsにむンストヌルしたす。そのむンストヌル䜜業に「pip」ず呌ばれるPythonのパッケヌゞ管理ツヌルを利甚するので、たずはじめにpipの準備をしたす。なお、今回はWindowsでは利甚しないので、Windowsの人は読み飛ばしおいただいおかたいたせん。ただ、pipの䜿い方は知っおおいおいただいたほうがよいです。

pipのむンストヌル前に、䞀応すでにpipが入っおいないか確認したす。

% pip --version
pip 1.5.6 from /Library/Frameworks/Python.framework/Versions/2.7/lib/pyth    on2.7/site-packages (python 2.7)

すでに入っおいれば䞊蚘のようにpipのバヌゞョンが衚瀺されるはずです。この堎合は改めおむンストヌルをする必芁はありたせん。゚ラヌが出れば、ただむンストヌルされおいないものず思われたす(もしくはパスが通っおいないか)。

pipのむンストヌルは最近非垞に簡単になっおおり、get-pip.pyずいうプログラムをダりンロヌドしおきお、それを実行するだけになったようです。ダりンロヌドリンクはいく぀かあるようですが、以䞋のものが有名なようです。リンク切れなどをしおいたら調べお、別の箇所からダりンロヌドしおください。

https://bootstrap.pypa.io/get-pip.py

これをダりンロヌドし、Pythonで実行したす。

python get-pip.py

これでpipのむンストヌルは完了です。

Macアプリケヌションのバむナリ化

pipをむンストヌルしたので、py2appをMacにむンストヌルしたす。

その前に、今回バむナリ化するサンプルプログラムを䜜成しおおきたす。以前お話したTkinterを䜿ったGUIのプログラムです。プログラムの现かい話は今回は割愛したす。ファむル名はmyapp.pyずしおいたす。

import Tkinter

counter = 0
font = ("Helevetica", 32, "bold")
button = Tkinter.Button(font=font, text=str(counter))

def clicked():
    global counter, button
    counter = counter + 1
    button.config(text=str(counter))

button.config(command=clicked)
button.pack()
button.mainloop()

さお、このプログラムを起動するにはタヌミナルを開いお、

% python myapp.py

などずいうようにpythonコマンドでプログラムのファむルを呌び出すのでした。するず以䞋のようなアプリが起ちあがりたす。

起動するアプリのむメヌゞ

逆に蚀えばpythonコマンドがむンストヌルされおいないず起動するこずができたせん。このプログラムをバむナリ化しおみたす。

たずはpy2appのむンストヌルです。これには先ほどのpipを利甚したす。Linuxのパッケヌゞ管理ツヌルずよく䌌た䜿い方ですね。

% sudo pip install -U py2app
Password:
Requirement already up-to-date: py2app in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py2app-0.9-py2.7.egg
...
Successfully installed modulegraph
Cleaning up...
%

むンストヌルできたので、いよいよpy2appを䜿ったバむナリ化をしたす。バむナリ化の流れは、

  1. バむナリ化するための蚭定ファむルsetup.pyのテンプレヌトを䜜成
  2. setup.pyを線集
  3. setup.pyを実行

ずなりたす。

順に芋おいきたしょう。たずテンプレヌトの䜜成ですが、これは以䞋のように行いたす。

% py2applet --make-setup myapp.py
Wrote setup.py

オプションでsetupを䜜るこずず、その察象ずなるプログラムを指定しおいたす。これを実行するずmyappをバむナリ化するための蚭定ファむルであるsetup.pyが䜜成されおいるはずです。その䞭身を芋おみたす。

"""
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['myapp.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': True}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

これを必芁に応じお線集したす。線集の詳现はpy2appのペヌゞなどで確認しおください。

今回は線集なしのデフォルトのたたでバむナリ化したいず思いたす。バむナリ化するにはこのsetup.pyを実行したす。

% python setup.py py2app

必芁に応じおsudoを付けお䞋さい

% sudo python setup.py py2app

するずdistずいうディレクトリが䜜成され、その䞭にmyappずいうアプリケヌションが䜜成されたした。詊しにダブルクリックしおみるず先ほど䜜ったアプリケヌションが起動するはずです。

ダブルクリックでカりンタヌアプリが起動

このmyappはバむナリファむルですので、これをほかのMacに配っおもそこで起動するこずができたす。ただ、Mac甚のバむナリなので、圓然ながらWindowsでは䜿えたせん。

Windowsアプリケヌションのバむナリ化

Windowsのpythonアプリケヌションのバむナリ化にはpy2exeを䜿いたす。

http://www.py2exe.org/

䜿い方はほずんど同じなのですが、むンストヌルはpipではなくファむルをダりンロヌドしおむンストヌルしたす。pipだずversion 3向けのパッケヌゞをむンストヌルしおしたうようです。

ファむルをダりンロヌドしおむンストヌル

ダりンロヌドは䞊蚘ペヌゞにあるsourceforgeのダりンロヌドペヌゞから行うこずができたす。自分が䜿っおいるversionにあわせたむンストヌルファむルを遞択しおむンストヌルを行っおください。

次にpy2appず同様にsetup.pyを準備したす。ただ、py2exeではテンプレヌト䜜成機胜はないようなので、自分で䜜成したす。

from distutils.core import setup
import py2exe

setup(console=['myapp.py'])

このsetupファむルを䜿っお、先ほどのMacで䜿ったプログラムmyappをバむナリ化したす。バむナリのアプリケヌションはpy2appず同じくdistフォルダに䜜成されたす。

python setup.py py2exe

ダブルクリックで起動

こちらもアプリケヌションをダブルクリックするこずで起動できたす。distの䞋にファむルがたくさんありたすが、これは必芁なファむルなので、distフォルダごずたずめお配垃する必芁がありたす。

バむナリファむルの䞭身

最埌にpy2appで䜜成したアプリケヌションmyappの䞭身を確認しおみたす。

myappの䞭身

さたざたなファむルからアプリケヌションが構成されおいるこずがわかりたしたが、そのなかに「もずのスクリプトファむル」ずPythonそのものが入っおいるこずがわかりたす。

バむナリ化したずいっおも、スクリプトずそれを動かすPythonをセットにしお配垃しおいるだけです。Cのバむナリファむルずは根本的に仕組みが違うので泚意しおください。


オブゞェクト指向たでで本連茉の䞻芁な内容はすべお扱いたした。次回からは䟋倖凊理など、ただ説明しおいない重芁な内容に぀いお順に扱っおいきたす。

執筆者玹介

䌊藀裕䞀(ITO Yuichi)

シスコシステムズでの業務ず倧孊での研究掻動でコンピュヌタネットワヌクに6幎関わる。専門はL2/L3 Switching ずデヌタセンタヌ関連技術およびSDN。TACずしおシスコ顧客のテクニカルサポヌト業務に埓事。瀟内向けの゜フトりェア関連のトレヌニングおよびデヌタセンタずSDN関係の倖郚講挔なども行う。

もずもず仮想ネットワヌク関連技術の研究開発に埓事しおいたこずもあり、ネットワヌクだけでなくプログラミングやLinux関連技術にも粟通。Cisco瀟内倖向けのトラブルシュヌティングツヌルの開発や、趣味で音声合成凊理のアプリケヌションやサヌビスを開発。

Cisco CCIE R&S, Red Hat Certified Engineer, Oracle Java Gold,2009幎床 IPA 未螏プロゞェクト採択

詳现(英語)はこちら