4

ファイルからの Python モジュールのインポートは、Python C API を使用すると比較的簡単ですがPyImport_Import()、文字列に格納された関数を使用する必要があります。文字列から Python モジュールをインポートする方法はありますか (明確にするために、ファイルはありません。コードは文字列にあります)、または文字列を一時ファイルとして保存する必要がありますか?

4

3 に答える 3

4

一時ファイルを使用する必要はありません。次のコードを使用します。

const char *MyModuleName = "blah";
const char *MyModuleCode = "print 'Hello world!'";
PyObject *pyModule = PyModule_New(MyModuleName);
// Set properties on the new module object
PyModule_AddStringConstant(pyModule, "__file__", "");
PyObject *localDict = PyModule_GetDict(pyModule);   // Returns a borrowed reference: no need to Py_DECREF() it once we are done
PyObject *builtins = PyEval_GetBuiltins();  // Returns a borrowed reference: no need to Py_DECREF() it once we are done
PyDict_SetItemString(localDict, "__builtins__", builtins);

// Define code in the newly created module
PyObject *pyValue = PyRun_String(MyModuleCode, Py_file_input, localDict, localDict);
if (pyValue == NULL) {
    // Handle error
}
else
    Py_DECREF(pyValue);

これは、実際の商用アプリケーションから取得したコードです (エラー処理やその他の不要な詳細を削除して、わずかに変更しました)。必要なモジュール名MyModuleNameと Python コードを設定するだけMyModuleCodeで完了です!

于 2017-03-17T09:17:37.317 に答える
1

私の理解が正しければ、PyImport_ImportModulewhich を取る aを使用しconst char* nameて、インポートするモジュールを指定できます。

私の理解が間違っていたので:

通常、内容を.pyファイルにダンプしてから実行する方が良いでしょうPyRun_Fileが、文字列があり、それらを操作したい場合は、それPy_CompileStringをコードオブジェクトにコンパイルしてからPyEval_EvalCode、評価のためにフィードすることができます.

于 2016-10-01T15:47:53.997 に答える