Python
 Computer >> コンピューター >  >> プログラミング >> Python

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 を指定した場合は、現在実行中のインタプリタの最適化レベルが適用されます。

  1. PythonのpyqrcodeモジュールでQRコードを生成する方法

    QRコードは、白い背景の上に黒い四角形を格子状に配置した2次元コードで、カメラなどの画像読み取り装置によって読み取ることができます。商業用途での在庫追跡や決済、ウェブサイトへのログインなど、スマートフォンユーザー向けのさまざまなアプリケーションで広く利用されています。Pythonではpyqrcodeモジュールを使うことで、簡単にQRコードを生成できます。QRコードには、データを効率的に格納するための4つの標準エンコードモード(数値モード、英数字モード、バイト/バイナリモード、漢字モード)が用意されています。英数字のQRコードを生成するpyqrcodeモジュールには、QRコードを生成するためのc

  2. Pythonのgetpassモジュールとは?パスワード入力とユーザー名取得の基本を解説

    Pythonの標準ライブラリには、ターミナル上で動作するアプリケーションにおいて、ユーザーの認証情報を検証してから処理を実行したい場合に役立つgetpassモジュールが用意されています。このモジュールには主に2つの関数が定義されており、セキュリティを意識したコマンドラインツールの開発に欠かせない存在です。 getpass() 関数:パスワードを安全に入力する getpass()関数は、ユーザーにパスワードの入力を促すための関数です。デフォルトでは、ターミナルに入力されたキーは画面に表示(エコー)されないため、第三者にパスワードを盗み見られる心配がありません。 また、プロンプトとして表示される