このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

最近知った小ネタ: PythonはZIPファイルを実行できる

Javaのjarに相当するPythonのファイル形式にeggがあります。eggを使って色々なことが出来るらしいのですが、作るのが難しいです。Pythonのエキスパート清水川さんでさえ「eggの作り方が分からない」と言っているくらいです(2009/07/06 http://www.freia.jp/taka/blog/655/)。

単に複数のPythonファイルを固めて渡したい、ということであれば、Python 2.6以降ならZIPフィアルを直接実行できます。

.pyファイル、または.pycファイル(あるいは両方)をZIPに入れて、エントリーポイントとなる __main__.py というファイルを作るだけです。

いま、次のようなファイル群があったとします。

myprog.py

\---mylib
__init__.py
greeting.py

myprog.py :

# -*- coding: utf-8 -*-
import mylib.greeting

def main():
    mylib.greeting.say(u'こんにちは')

if __name__ == '__main__':
    main()

__init__.py :

# empty file

greeting.py :

# -*- coding: utf-8 -*-
def say(msg):
    u"あいさつをします."
    print msg

あとは、__main__.py を作ってZIPするだけなんですが、念のためシェルスクリプトを作りました。(zipコマンド(InfoZip)ではなく、僕は普通jarコマンドを使ってます。)

#!/bin/sh
ZIP='jar -cvMf'
SUFF=$$

mkdir -p TmpWork${SUFF}
mkdir -p TmpWork${SUFF}/mylib
cp mylib/*   TmpWork${SUFF}/mylib/
cp myprog.py TmpWork${SUFF}/
echo 'import myprog' > TmpWork${SUFF}/__main__.py
echo 'myprog.main()'>> TmpWork${SUFF}/__main__.py

cd TmpWork${SUFF}
python __main__.py

$ZIP ../myprog.zip .
cd ..

rm -r TmpWork${SUFF}

一度 __main__.py を実行しているのは、確認とともに.pycファイルを作らせるためです。


$ sh mkzip.sh
こんにちは
adding: ./ (in=0) (out=0) (stored 0%)
adding: mylib/ (in=0) (out=0) (stored 0%)
adding: mylib/greeting.py (in=91) (out=86) (deflated 5%)
adding: mylib/greeting.pyc (in=370) (out=217) (deflated 41%)
adding: mylib/__init__.py (in=14) (out=16) (deflated -14%)
adding: mylib/__init__.pyc (in=162) (out=129) (deflated 20%)
adding: myprog.py (in=149) (out=123) (deflated 17%)
adding: myprog.pyc (in=476) (out=289) (deflated 39%)
adding: __main__.py (in=28) (out=25) (deflated 10%)
Total:

          • -

(in = 1290) (out = 1807) (deflated -40%)

$ jar tvf myprog.zip
0 ./
0 mylib/
91 mylib/greeting.py
370 mylib/greeting.pyc
14 mylib/__init__.py
162 mylib/__init__.pyc
149 myprog.py
476 myprog.pyc
28 __main__.py

$ python myprog.zip
こんにちは

$