- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在我的 C++ 程序中嵌入了 Python。
我使用 PyImport_ImportModule 加载以 .py 文件编写的模块。但是我怎样才能从内存中加载它呢?假设我的 .py 文件是加密的,所以我需要先解密它并将代码提供给 python 来执行。
此外,如果我可以绕过/拦截或修改导入机制就好了,这样就不会从文件系统加载模块,而是加载我自己的内存块,我该怎么做?
最佳答案
以下示例显示如何从 C 字符串定义模块:
#include <stdio.h>
#include <Python.h>
int main(int argc, char *argv[])
{
Py_Initialize();
PyRun_SimpleString("print('hello from python')");
// fake module
char *source = "__version__ = '2.0'";
char *filename = "test_module.py";
// perform module load
PyObject *builtins = PyEval_GetBuiltins();
PyObject *compile = PyDict_GetItemString(builtins, "compile");
PyObject *code = PyObject_CallFunction(compile, "sss", source, filename, "exec");
PyObject *module = PyImport_ExecCodeModule("test_module", code);
PyRun_SimpleString("import test_module; print(test_module.__version__)");
Py_Finalize();
return 0;
}
输出:
hello from python
version: 2.0
您可以阅读有关 import hooks 的信息在文档中。您需要使用 find_module
和 load_module
方法定义一个类。像下面这样的东西应该可以工作:
PyObject* find_module(PyObject* self, PyObject* args) {
// ... lookup args in available special modules ...
return Py_BuildValue("B", found);
}
PyObject* load_module(PyObject* self, PyObject* args) {
// ... convert args into filname, source ...
PyObject *builtins = PyEval_GetBuiltins();
PyObject *compile = PyDict_GetItemString(builtins, "compile");
PyObject *code = PyObject_CallFunction(compile, "sss", source, filename, "exec");
PyObject *module = PyImport_ExecCodeModule("test_module", code);
return Py_BuildValue("O", module);
}
static struct PyMethodDef methods[] = {
{ "find_module", find_module, METH_VARARGS, "Returns module_loader if this is an encrypted module"},
{ "load_module", load_module, METH_VARARGS, "Load an encrypted module" },
{ NULL, NULL, 0, NULL }
};
static struct PyModuleDef modDef = {
PyModuleDef_HEAD_INIT, "embedded", NULL, -1, methods,
NULL, NULL, NULL, NULL
};
static PyObject* PyInit_embedded(void)
{
return PyModule_Create(&modDef);
}
int main() {
...
PyImport_AppendInittab("embedded", &PyInit_embedded);
PyRun_SimpleString("\
import embedded, sys\n\
class Importer:\n\
def find_module(self, fullpath):\n\
return self if embedded.find_module(fullpath) else None\n\
def load_module(self, fullpath):\n\
return embedded.load_module(fullpath)\n\
sys.path_hooks.insert(0, Importer())\n\
");
...
}
关于python - PyImport_ImportModule,可以从内存中加载模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605612/
我在我的 C++ 程序中嵌入了 Python。 我使用 PyImport_ImportModule 加载以 .py 文件编写的模块。但是我怎样才能从内存中加载它呢?假设我的 .py 文件是加密的,所以
这是程序的典型示例 extending embedded Python 3.x在 C/C++ 中: #include //// Definition of 'emb' Python module /
我尝试使用 Python C api 从 C++ 中的 python 调用函数,测试成功。 但是如果我打算导入一个已经导入其他模块的模块,Pymodule_findmodule 将返回 Null,即使
环境 : MacOS(Catalina 版本 10.15.4) Python3.7.6 Go1.13.8 我想使用 go-python3 调用一个用 Python3 编写的算法,但是如上所述,当我第二
我在我的 C++ 程序中使用 Python C API,我注意到一件奇怪的事情。 在我的 PC 上的调试器中运行这样一个简单的程序时: int main(int argc, const char *
我是一名优秀的程序员,十分优秀!