compileall – ソースファイルをバイトコンパイルする

目的:ソースファイルをバイトコンパイルされたファイルに変換する
利用できるバージョン:1.4

compileall モジュールは Python のソースファイルを見つけてバイトコンパイルされたファイルにコンパイルします。その出力は .pyc.pyo ファイルに保存されます。

ディレクトリ単位でコンパイルする

compile_dir() はディレクトリを再帰的に調べて、その中にあるファイルをバイトコンパイルします。

import compileall

compileall.compile_dir('examples')

デフォルトでは、深さ10までの全サブディレクトリを調べます。subversion のようなバージョン管理システムを使用しているときは次のように不要な調査を行います。

$ python compileall_compile_dir.py
Listing examples ...
Listing examples/.svn ...
Listing examples/.svn/prop-base ...
Listing examples/.svn/text-base ...
Compiling examples/a.py ...
Listing examples/subdir ...
Listing examples/subdir/.svn ...
Listing examples/subdir/.svn/prop-base ...
Listing examples/subdir/.svn/text-base ...
Compiling examples/subdir/b.py ...

ディレクトリをフィルタするには rx 引数に除外する名前にマッチする正規表現を渡します。

import compileall
import re

compileall.compile_dir('examples', 
    rx=re.compile(r'/\.svn'))
$ python compileall_exclude_dirs.py
Listing examples ...
Listing examples/.svn ...
Listing examples/.svn/prop-base ...
Listing examples/.svn/text-base ...
Compiling examples/a.py ...
Listing examples/subdir ...
Listing examples/subdir/.svn ...
Listing examples/subdir/.svn/prop-base ...
Listing examples/subdir/.svn/text-base ...
Compiling examples/subdir/b.py ...

maxlevels 引数は再帰的に調べる深さを制御します。例えば、再帰的に調べないには 0 を渡します。

import compileall
import re

compileall.compile_dir('examples', 
    maxlevels=0, 
    rx=re.compile(r'/\.svn'))
$ python compileall_recursion_depth.py
Listing examples ...
Compiling examples/a.py ...

sys.path をコンパイルする

compile_path() を呼び出すと sys.path で見つけた全ての Python ソースファイルをコンパイルします。

import compileall
import sys

sys.path[:] = ['examples', 'notthere']
print 'sys.path =', sys.path
compileall.compile_path()

このサンプルは、実行してパーミッションエラーが起きないようにデフォルトの sys.path を置き換えています。それでも、デフォルトの動作は把握できます。 maxlevels の値はデフォルトから 0 になるので注意してください。

$ python compileall_path.py
sys.path = ['examples', 'notthere']
Listing examples ...
Compiling examples/a.py ...
Listing notthere ...
Can't list notthere

コマンドラインから

Makefile 経由でビルドシステムから利用するといったコマンドラインからも compileall を実行できます。例えば、次の通りです。

$ python -m compileall -h
option -h not recognized
usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [-i list] [directory|file ...]
-l: don't recurse down
-f: force rebuild even if timestamps are up-to-date
-q: quiet operation
-d destdir: purported directory name for error messages
   if no directory arguments, -l sys.path is assumed
-x regexp: skip files matching the regular expression regexp
   the regexp is searched for in the full path of the file
-i list: expand list with its content (file and directory names)

前節で紹介したサンプルと同様に .svn ディレクトリをスキップするには次のように実行します。

$ python -m compileall -x '/\.svn' examples
Listing examples ...
Listing examples/.svn ...
Listing examples/.svn/prop-base ...
Listing examples/.svn/text-base ...
Compiling examples/a.py ...
Listing examples/subdir ...
Listing examples/subdir/.svn ...
Listing examples/subdir/.svn/prop-base ...
Listing examples/subdir/.svn/text-base ...
Compiling examples/subdir/b.py ...

See also

compileall
本モジュールの標準ライブラリドキュメント
Bookmark and Share