Pythonバイトコード(.pyc)ファイルには、Pythonバージョン間で変更されるマジックナンバーで始まるヘッダーがあります。現在のPythonバージョンですか?現在、Python 3.7.1のハードコーディングをしていますが、特定のPythonバージョン。
この回答 はpy_compile.MAGIC
を使用して私が望んでいることを正確に行いますが、Python = 3. Python 3?
ここに私がやろうとしていることの例があります:
import dis
import marshal
PYC_HEADER = b'\x42\x0d\x0d\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
def f():
print('Hello World')
with open('test.pyc', 'wb') as pyc:
pyc.write(PYC_HEADER)
marshal.dump(dis.Bytecode(f).codeobj, pyc)
これにより、ファイルtest.pyc
が作成され、スクリプトと同じPythonインタープリター)を使用して実行できるようになり、「Hello World!」と出力されるはずです。 Python 3.7。を使用して、Python 3のいずれかのバージョンがハードではなく、スクリプトを実行するために使用されるヘッダーを生成する方法を探しています。 -コーディング3.7。
コンテキストの場合:
シンプルなプログラミング言語をさまざまなバイトコード形式にコンパイルしています(LLVM、Javaバイトコード、Webアセンブリ、そして今Pythonバイトコード)をチュートリアルシリーズの一部としてコンパイラの構築。
byteasmライブラリー を使用してPythonバイトコードを生成できます。内容を.pyc
ファイルに書き込むには、有効なヘッダーが必要です。ヘッダーをハードコーディングすることで、チュートリアルに従う人がPython 3私は(3.7)か、バージョンのマジックナンバーを手動で見つける必要があります。
Python 3.4の時点で、モジュールimportlib
には importlib.util.MAGIC_NUMBER
があります。
>>> import importlib
>>> importlib.util.MAGIC_NUMBER.hex()
'420d0d0a'
Python <3.4またはPython2の別の解決策は、imp
モジュールの get_magic
メソッド です。
>>> import imp
>>> imp.get_magic().hex()
'420d0d0a'
これはまだPython 3.7で動作しますが、Python 3.4
動いた!1
>>> import importlib.util
>>> importlib.util.MAGIC_NUMBER
b'3\r\r\n'
これをtry/exceptでラップしてpy_compile
にフォールバックするのがおそらく最も簡単です。