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
- 本モジュールの標準ライブラリドキュメント