2014-11-04 67 views
1

我有一個非常特殊的模塊查找器和加載器的Python(2.7和3.x)的嵌入式版本。這些查找程序和加載程序都是用C編寫的,必須能夠通過名稱加載C擴展模塊並將其與fqmn關聯。如何從C加載C擴展

雖然它是非常簡單的如何手動加載純python模塊(打開文件,讀取數據,執行)我找不到如何使用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; 
}