.pyファイルから.pycファイルを手動で生成する方法


128

何らかの理由で、Pythonの「インポート」ステートメントに依存して.pycファイルを自動的に生成できない

次のように関数を実装する方法はありますか?

def py_to_pyc(py_filepath, pyc_filepath):
    ...

回答:


241

compileall端末で使用できます。次のコマンドは、サブディレクトリに再帰的に移動し、見つかったすべてのpythonファイルのpycファイルを作成します。compileallのあなたがそれを使用するためには何の余分をインストールする必要はありませんので、モジュールは、Pythonの標準ライブラリの一部です。これはpython2とpython3でまったく同じように機能します。

python -m compileall .

4
これは受け入れられる答えであるはずです-少なくとも私のすべての* .pyを* .pycにコンパイルする必要があります:再帰的に:)
swdev

1
使用するすべてのライブラリを含むPYCファイルを配布することはできますか?ユーザーはそれらをインストールする必要はなく、PYCファイルを実行するだけです。JavaではJARを使用してこれが可能であることはわかっていますが、Pythonに同様の方法はありますか?
D.Snap 2016年

Pythonのメタファイルについても聞いたことがあります。このコンパイルはまた、いくつかのキャッシュを構築しますか?そうでない場合、そのためのコマンドは何ですか?エンドユーザーにはlibディレクトリへの書き込み権限がないため。ここでスピードアップしたい... PS。-Oバイトコード(.pyoファイルiso .pyc)コンパイルのフラグも確認してください。
danger89

逆コンパイルはどうですか?
Sajuuk

1
このコマンドには注意してください。私は誤っcompileallて自分のサイトパッケージフォルダーを実行し、それがすべてを台無しにしました
Alex

58

コマンドラインから個々のファイルをコンパイルするには、次のようにします。

python -m compileall <file_1>.py <file_n>.py

55

私が最後にPythonを使用してから久しぶりですが、以下を使用できると思いますpy_compile

import py_compile
py_compile.compile("file.py")

8
おそらく、出力ファイルを決定する2番目のパラメーターを含める必要があります。それ以外の場合は、デフォルトで次のように__pycache__/file.cpython-32.pycなり、それを戻り値として取得します。
rvighne 2014

46

Pythonスクリプトをバイトコードにコンパイルする方法をいくつか見つけました

  1. py_compile端末での使用:

    python -m py_compile File1.py File2.py File3.py ...

    -m コンパイルするモジュール名を指定します。

    または、ファイルのインタラクティブなコンパイル用

    python -m py_compile -
    File1.py
    File2.py
    File3.py
       .
       .
       .
  2. 使用py_compile.compile

    import py_compile
    py_compile.compile('YourFileName.py')
  3. 使用py_compile.main()

    一度にいくつかのファイルをコンパイルします。

    import py_compile
    py_compile.main(['File1.py','File2.py','File3.py'])

    リストは、必要に応じて長くすることができます。別の方法として、メインでファイルのリストを渡すことや、コマンドライン引数でファイル名を渡すこともできます。

    または、['-']main を渡すと、インタラクティブにファイルをコンパイルできます。

  4. 使用compileall.compile_dir()

    import compileall
    compileall.compile_dir(direname)

    指定されたディレクトリにあるすべてのPythonファイルをコンパイルします。

  5. 使用compileall.compile_file()

    import compileall
    compileall.compile_file('YourFileName.py')

以下のリンクをご覧ください。

https://docs.python.org/3/library/py_compile.html

https://docs.python.org/3/library/compileall.html


一つの小さな修正は、あなたがロードされているモジュール名があるということであるpy_compilecompileallしませんpy_compile.pycompileall.py。つまり、python3 -m py_compile PYTHON_FILENAMEまたはである必要がありますpython3 -m compileall PYTHON_FILES_DIRECTORY
Devy

17

私はcompileallを使用します。スクリプトとコマンドラインの両方からうまく機能します。これは、内部で使用する前述のpy_compileよりも少し高いレベルのモジュール/ツールです。


compileall対応する.pycファイルが既に最新のファイルをスキップするロジックは含まれていませんか?
Kyle Strand 14

2
@KyleStrand compileallは既に最新のファイル.pyc(Python 2.7.11でテスト済み)をスキップしません
代名詞

@Eponymous興味深い。なぜ私が他に考えたのかわからない。確認していただきありがとうございます。
カイルストランド

6

Python2では、以下を使用できます。

python -m compileall <pythonic-project-name>

サブフォルダーを含むプロジェクトですべて.pyをコンパイル.pycします。


Python3では、以下を使用できます。

python3 -m compileall <pythonic-project-name>

これはコンパイル全てなり.py__pycache__サブフォルダを含んでいたプロジェクト内のフォルダ。

または、この投稿の褐色化:

以下を使用すること.pycで、Python2 と同じフォルダー内のファイルのレイアウトを適用できます。

python3 -m compileall -b <pythonic-project-name>

このオプション-b.pyc、レガシーロケーションへのファイルの出力をトリガーします(つまり、Python2と同じ)。


3

元の質問の要件(ソースパスと宛先パス)に一致させるには、コードは次のようにする必要があります。

import py_compile
py_compile.compile(py_filepath, pyc_filepath)

入力コードにエラーがある場合、py_compile.PyCompileError例外が発生します。


1

これを行うには2つの方法があります

  1. コマンドライン
  2. Pythonプログラムの使用

コマンドラインを使用python -m compileall <argument>している場合は、PythonコードをPythonバイナリコードにコンパイルするために使用します。例:python -m compileall -x ./*

または、 このコードを使用して、ライブラリをバイトコードにコンパイルできます。

import compileall
import os

lib_path = "your_lib_path"
build_path = "your-dest_path"

compileall.compile_dir(lib_path, force=True, legacy=True)

def compile(cu_path):
    for file in os.listdir(cu_path):
        if os.path.isdir(os.path.join(cu_path, file)):
            compile(os.path.join(cu_path, file))
        elif file.endswith(".pyc"):
            dest = os.path.join(build_path, cu_path ,file)
            os.makedirs(os.path.dirname(dest), exist_ok=True)
            os.rename(os.path.join(cu_path, file), dest)

compile(lib_path)

詳細なドキュメントについては、☞docs.python.orgご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.