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
こんにちは
$