2016-06-03 12 views
5

मैं अपने सी ++ प्रोग्राम में एम्बेडेड पायथन।PyImport_ImportModule, स्मृति से मॉड्यूल लोड करने के लिए संभव है?

मैं एक .py फ़ाइल में लिखे गए मेरे मॉड्यूल को लोड करने के लिए PyImport_ImportModule का उपयोग करता हूं। लेकिन मैं इसे स्मृति से कैसे लोड कर सकता हूं? आइए मान लें कि मेरी .py फ़ाइल एन्क्रिप्ट की गई है, इसलिए मुझे इसे पहले डिक्रिप्ट करने और निष्पादित करने के लिए कोड को पायथन पर फ़ीड करने की आवश्यकता है।

इसके अलावा, यह अच्छा होगा अगर मैं आयात तंत्र को बाईपास/अवरुद्ध या संशोधित कर सकता हूं, ताकि फाइल सिस्टम से मॉड्यूल लोड न हो लेकिन मेरे स्वयं के मेमोरी ब्लॉक, मैं यह कैसे कर सकता/सकती हूं?

उत्तर

6

निम्न उदाहरण दिखाता है कि कैसे एक सी स्ट्रिंग से एक मॉड्यूल को परिभाषित करने के:

#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\ 
"); 
    ... 
} 
+0

धन्यवाद! पहला उदाहरण पूरी तरह से काम करता है! – kchkg

संबंधित मुद्दे