2014-11-04 3 views
1

У меня есть встроенная версия Python (2.7 и 3.x) с очень специальным модулем поиска и загрузчика. Эти поисковые устройства и загрузчики записываются на C и должны иметь возможность загружать модуль расширения C по имени и связывать его с fqmn.Как загрузить расширение C из C

Хотя довольно просто, как вручную загружать чистый модуль python (открыть файл, читать данные, exec) Я не могу найти, как это сделать с помощью C-расширений.

Есть ли пример или какой-то проект с открытым исходным кодом, который его демонстрирует?

ответ

1

Модуль имп сделал это:

PyObject* load_c_extension(const char *fqmn, const char *filepath) 
{ 
    static PyObject *load_module = NULL; 
    static PyObject *open_file = NULL; 

    if (!load_module) 
    { 
     PyObject *imp_module = PyImport_ImportModule("imp"); 
     if (!imp_module) 
      return NULL; 

     load_module = PyObject_GetAttrString(imp_module, "load_module"); 
     Py_DECREF(imp_module); 

     if (!load_module) 
      return NULL; 
    } 

    if (!open_file) 
    { 
     PyObject *builtins = PyEval_GetBuiltins(); 
     if (!builtins) 
      return NULL; 

     open_file = PyDict_GetItemString(builtins, "open"); 
     if (!open_file) 
      return NULL; 
    } 

    PyObject *module_file = PyObject_CallFunction(open_file, "ss", filename, "rb"); 
    if (!module_file) 
     return NULL; 

#if defined(_WIN32) 
    PyObject *module = PyObject_CallFunction(load_module, "sOs(ssi)", fqmn, module_file, filename, ".pyd", "rb", 3); 
#else 
    PyObject *module = PyObject_CallFunction(load_module, "sOs(ssi)", fqmn, module_file, filename, ".so", "rb", 3); 
#endif 
    Py_DECREF(module_file); 

    if (!module) 
     return NULL; 

    return module; 
} 
Смежные вопросы