Pythonライブラリのバイトコンパイル徹底解説!py_compileモジュールの使い方
Pythonはインタプリタ型言語ですが、スクリプト(.py拡張子)を実行する際には、内部でソースコードがバイトコードへとコンパイルされます。そして、そのバイトコードは実行後に自動的に削除される仕組みになっています。
一方、モジュール(事前にコンパイル済みの組み込みモジュールを除く)を初めてインポートした際には、そのコンパイル版が自動的に生成され、__pycache__ フォルダ内に .pyc 拡張子で保存されます。以降、同じモジュールをインポートする際には再コンパイルは行われず、すでに作成されたバイトコードがそのまま利用されます。
py_compileモジュールとは
.py拡張子のPythonスクリプトファイルは、実際に実行しなくても明示的にコンパイルすることが可能です。これを実現するのが py_compile モジュールで、この中に含まれる compile() 関数を使用します。
生成される .pyc ファイルの名前には、Pythonのバージョン番号が付加されます。たとえばPython 3.7の場合、「cpython-37」というサフィックスがファイル名に付けられます。
通常の開発ではこのモジュールを意識的に使う機会は多くありませんが、複数ユーザーで共有する環境にモジュールをインストールする場合など、ソースコードのあるディレクトリへの書き込み権限を持たないユーザーがいるケースでは非常に役立ちます。
コマンドラインからバイトコンパイルを行う
py_compileモジュールにはコマンドラインインターフェースが用意されており、-m スイッチを使って次のように実行できます。
E:\python37>python -m py_compile hello.py
このコマンドを実行すると、__pycache__ サブフォルダ内に「hello.cpython-37.pyc」ファイルが作成・保存されます。
プログラム内からバイトコンパイルを行う
バイトコンパイルは、py_compileモジュールの compile() 関数を使って、プログラムの中から実行することもできます。
import py_compile
py_compile.compile("hello.py").pycファイルの実行方法と注意点
.pyc拡張子のバイトコードファイルは、.py拡張子の通常のスクリプトと同様に、コマンドラインから直接実行できます。
E:\python37>python __pycache__/hello.cpython-37.pyc
ただし重要な注意点として、バイトコードファイルはコンパイル時と同じバージョンのインタプリタでしか実行できません。異なるバージョンのPythonで実行しようとすると、次のようなエラーが表示されます。
C:\python36>python e:hello.cpython-37.pyc RuntimeError: Bad magic number in .pyc file
py_compileモジュールのその他の機能
main()関数による一括コンパイル
py_compileモジュールには、複数のソースファイルをまとめてコンパイルする main() 関数も用意されています。引数として指定されたファイルがコンパイルされ、生成されたバイトコードは通常の方法でキャッシュされます。なお、この関数はディレクトリ構造を再帰的に検索してソースファイルを探すことはせず、明示的に指定されたファイルのみをコンパイルします。
PyCompileError例外
モジュールには PyCompileError という例外クラスも定義されています。これは、ファイルのコンパイル中にエラーが発生した場合に送出されるものです。ただし、この例外が発生するのは、compile() 関数の doraise オプションが True に設定されている場合のみです。
optimizeオプションによる最適化レベルの制御
compile() 関数の optimize オプションを使用すると、最適化レベルを制御できます。この値は組み込みの compile() 関数にそのまま渡されます。デフォルト値の -1 を指定した場合は、現在実行中のインタプリタの最適化レベルが適用されます。
-
PythonのpyqrcodeモジュールでQRコードを生成する方法
QRコードは、白い背景の上に黒い四角形を格子状に配置した2次元コードで、カメラなどの画像読み取り装置によって読み取ることができます。商業用途での在庫追跡や決済、ウェブサイトへのログインなど、スマートフォンユーザー向けのさまざまなアプリケーションで広く利用されています。Pythonではpyqrcodeモジュールを使うことで、簡単にQRコードを生成できます。QRコードには、データを効率的に格納するための4つの標準エンコードモード(数値モード、英数字モード、バイト/バイナリモード、漢字モード)が用意されています。英数字のQRコードを生成するpyqrcodeモジュールには、QRコードを生成するためのc
-
Pythonのgetpassモジュールとは?パスワード入力とユーザー名取得の基本を解説
Pythonの標準ライブラリには、ターミナル上で動作するアプリケーションにおいて、ユーザーの認証情報を検証してから処理を実行したい場合に役立つgetpassモジュールが用意されています。このモジュールには主に2つの関数が定義されており、セキュリティを意識したコマンドラインツールの開発に欠かせない存在です。 getpass() 関数:パスワードを安全に入力する getpass()関数は、ユーザーにパスワードの入力を促すための関数です。デフォルトでは、ターミナルに入力されたキーは画面に表示(エコー)されないため、第三者にパスワードを盗み見られる心配がありません。 また、プロンプトとして表示される