2016-10-01 20 views
2

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

答えて

1

私の理解が正しい場合は、const char* nameにインポートするモジュールを指定するPyImport_ImportModuleを使用できます。

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

一般的には、文字列を持っていると私はを推測したもので作業したい場合は、PyRun_Fileでそれらを実行するが、その後.pyファイルに内容をダンプして方が良いでしょうPy_CompileStringを使用してコードオブジェクトにコンパイルし、評価のためにPyEval_EvalCodeに供給することができます。

+0

ファイルはありません。モジュールの内容は文字列に格納されます。 – Hullu2000

+0

ええと、内容をファイルにダンプしてからインポートすることはできませんか?有効なPythonコードをexecする関数があると確信していますが、いくつかの例を追加できますか? –

+0

私のアプリケーションには、ユーザーがPythonコードを入力して実行できるテキスト編集領域があります。コードを実行するために、プログラムは関数を呼び出して呼び出します。 – Hullu2000

1

一時ファイルを使用する必要はありません。これは、実際の商用アプリケーションから取得したコードは(私は少しエラー処理や他の非必要な詳細情報を除去することによって、それを変更した)され

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に設定するだけです。

関連する問題