2

「a.pyc」、「b.pyc」などの Python バイトコード ファイルがあります。このファイルを C++ コードで実行したいと考えています。コードは、boost.python または python/c api を呼び出すことができます。PyEval_EvalCode?

PyObject* PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)

しかし、バイトコードファイルから PyCodeObject を取得する方法。

4

2 に答える 2

5

私の知る限り、VeryHighLevelレイヤーからこれを行うことはできません。(試したことはありPyRun_SimpleFileExFlagsますか?)では、ImportingModulesAPIを確認します。

インポートしようとしているだけの場合foo、または同等のimportlib風の処理を実行しようとしている場合は、それがそうであるかどうかを気にせずにfoo.pyfoo.pycそれほど難しくはありません。ただし、インポートの通常のルールを回避し、パス名でファイルを明示的に指定しようとしている場合は、それが可能である必要がありますが、それを行う方法は考えられません。ただし、次の場合を除きます。

.pycファイルは、内部では、からのマジックナンバー、PyImport_GetMagicNumber()無視できる4バイトのタイムスタンプ、marshal.loadsPythonまたはPyMarshal_ReadObjectFromStringCからのマーシャリングされたコードオブジェクトです。

私はこれをCからではなく、Pythonからテストしました。

>>> with open('foo.pyc', 'rb') as f:
...     data = f.read()
>>> code = marshal.loads(data[8:])
>>> code
<code object <module> at 0x110118730, file "foo.py", line 1>

そしてそれを調べると、それはまさにそれが本来あるべき姿であるように思われます。

于 2013-01-07T23:49:18.520 に答える
-1

これは、Python の Web サイトでかなり詳しく文書化されています : http://docs.python.org/2/extending/extending.html

主なアイデアは、Python を初期化し、次にモジュール (.pyc モジュールで PyImport_Import ) を初期化し、次に PyOject_CallObject を初期化することです。

呼び出したい特定のメソッドがあると仮定しています。

http://docs.python.org/2/extending/embedding.html#pure-embedding

于 2013-01-07T23:55:28.080 に答える