檜山正幸のキマイラ飼育記 このページをアンテナに追加 RSSフィード Twitter

キマイラ・サイトは http://www.chimaira.org/です。
トラックバック/コメントは日付を気にせずにどうぞ。
連絡は hiyama{at}chimaira{dot}org へ。
蒸し返し歓迎!
このブログの更新は、Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama
ところで、アーカイブってけっこう便利ですよ。

2012-03-21 (水)

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

| 09:44 | 最近知った小ネタ: 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
こんにちは

$

最近知った小ネタ その2:Windowsで使えるless

| 12:29 | 最近知った小ネタ その2:Windowsで使えるlessを含むブックマーク

僕は、Windows上でMinGW/MSYSのbashを使うことが多いのですが、MSYS付属のlessだと日本語をうまく扱えないのですよ。最近はUTF-8のドキュメントも多いので、Shift_JISだけじゃなくてUTF-8にも対応したlessが欲しいですね。

mattnさんがパッチを作成しておられて*1http://mattn.kaoriya.net/software/20081016143143.htm 「Windows版のlessでもutf-8なファイルを見れるようにする」)、twkさんがバイナリ版を配布しています(今日はサイトが落ちているようです http://nonn-et-twk.net/twk/windows-less-utf8 「Windows版less UTF-8対応版バイナリー配布」)。

このlessは、デフォルトのエンコーディングはShift_JISですが、環境変数LESSCHARSETにエンコーディングを指定できます。例えば、一時的にUTF-8に設定してファイルを見る場合は、env LESSCHARSET=utf-8 less file.txt とか。

*1:lvのWindows版も→ http://mattn.kaoriya.net/software/20111031104749.htm 「日本語ページャlvをwindowsにポーティングした。」

トラックバック - http://d.hatena.ne.jp/m-hiyama/20120321