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

从Python C API中的字符串导入模块,python,c,python-c-api,cross-language,Python,C,Python C Api,Cross Language,使用pythoncapi和PyImport\u Import()从文件导入Python模块相对容易,但是我需要使用存储在字符串中的函数。有没有一种方法可以从字符串中导入python模块(澄清一下:没有文件;代码在字符串中)或者我必须将字符串保存为临时文件?如果我的理解正确,您可以使用一个const char*name来指定要导入的模块 因为我的理解是错误的: 一般来说,最好将内容转储到.py文件中,然后使用执行它们,但是,如果您有字符串,并且希望使用这些字符串,我想您可以将其编译为代码对象,然后

使用pythoncapi和
PyImport\u Import()
从文件导入Python模块相对容易,但是我需要使用存储在字符串中的函数。有没有一种方法可以从字符串中导入python模块(澄清一下:没有文件;代码在字符串中)或者我必须将字符串保存为临时文件?

如果我的理解正确,您可以使用一个
const char*name
来指定要导入的模块

因为我的理解是错误的:


一般来说,最好将内容转储到
.py
文件中,然后使用执行它们,但是,如果您有字符串,并且希望使用这些字符串,我想您可以将其编译为代码对象,然后将其提供给评估。

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

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代码,就完成了

我成功地遵循了迪米特尔斯制定的战略

Py_Initialize();
PyObject*module=Py\u编译器字符串(
//语言:Python
R“EOT(
伪造保单={
“maxConnections”:4,
“policyDir”:“/tmp”,
“enableVhostPolicy”:正确,
“enableVhostNamePatterns”:False,
})EOT“,
“测试模块”,Py_文件(输入);
需要(模块!=nullptr);
PyObject*pModuleObj=PyImport\u execcodemodel(“测试模块”,模块);
REQUIRE(pModuleObj!=nullptr);
//最好使用if检查,使用PyErr_Print()或类似的方法读取错误
PyObject*pAttrObj=PyObject_GetAttrString(pModuleObj,“伪策略”);
需要(pAttrObj!=nullptr);
自动*实体=重新解释(pAttrObj);
要求(qd_实体(实体,“enableVhostNamePatterns”);//测试输入的健全性检查
//调用Py_DecRef s

写这篇文章时,我用了另一个参考资料。

没有文件;模块内容存储在一个字符串中。嗯,你不能将内容转储到一个文件中然后导入它吗?我很确定有一些函数可以执行有效的python代码,您能添加一些示例吗?我的应用程序包含一个文本编辑区域,用户可以在其中键入python代码并执行它。为了执行代码,程序放入函数并调用它。将其转储到一个临时文件中,然后让python对其进行解析、编译和评估应该更容易。如果您需要手动执行,我添加的函数应该可以帮助您。是否可以将一个函数替换为另一个具有相同名称和参数的函数,以便可以编辑代码?