python - 从 Python C API 中的字符串导入模块

标签 python c python-c-api cross-language

使用带有 PyImport_Import() 的 Python C API 从文件导入 Python 模块相对容易,但是我需要使用存储在字符串中的函数。有没有办法从字符串中导入 python 模块(澄清一下:没有文件;代码在字符串中)或者我必须将字符串保存为临时文件吗?

最佳答案

无需使用临时文件。使用此代码:

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 中设置所需的模块名称,在 MyModuleCode 中设置 Python 代码即可!

关于python - 从 Python C API 中的字符串导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39808521/

相关文章:

python - 使用Python解析日期时间范围之间的日志

c - 首先给出 16 和 3935 并且输出没有响应是给我数字而不是二进制

python - 如何使用正确的 dll 文件在 Cython C 扩展中启用第 3 方 C 库?

Python C 扩展 - 接收字典作为参数

python - 程序第二次运行时 multiarray.pyd 出现未处理的异常

python - 对 Pandas 数据框中的所有值求和的最佳方法是什么?

python - Python 2.7 的操作顺序

python - 使用 for 循环的函数,在达到特定数字之前对列表中的数字进行求和

c - 我应该在大学学习完 C 语言类(class)后阅读 K&R 吗?

有人可以建议我,如何对此数据接收代码实现暂停和恢复功能吗?