python – PyImport_ImportModule,可以从内存加载模块吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – PyImport_ImportModule,可以从内存加载模块吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2380字,纯文字阅读大概需要4分钟。
内容图文
![python – PyImport_ImportModule,可以从内存加载模块吗?](/upload/InfoBanner/zyjiaocheng/971/15f571d639f546d3a2b49cd3c5f8427a.jpg)
我在我的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\nclass 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)\nsys.path_hooks.insert(0, Importer())\n");
...
}
内容总结
以上是互联网集市为您收集整理的python – PyImport_ImportModule,可以从内存加载模块吗?全部内容,希望文章能够帮你解决python – PyImport_ImportModule,可以从内存加载模块吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。