ファイルからの Python モジュールのインポートは、Python C API を使用すると比較的簡単ですがPyImport_Import()
、文字列に格納された関数を使用する必要があります。文字列から Python モジュールをインポートする方法はありますか (明確にするために、ファイルはありません。コードは文字列にあります)、または文字列を一時ファイルとして保存する必要がありますか?
1968 次
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_ImportModule
which を取る aを使用しconst char* name
て、インポートするモジュールを指定できます。
私の理解が間違っていたので:
通常、内容を.py
ファイルにダンプしてから実行する方が良いでしょうPyRun_File
が、文字列があり、それらを操作したい場合は、それPy_CompileString
をコードオブジェクトにコンパイルしてからPyEval_EvalCode
、評価のためにフィードすることができます.
于 2016-10-01T15:47:53.997 に答える