__all__ = ['PythonWrapperModule'] import re import os import sys from parser.api import * from wrapper_base import * from py_wrap_type import * from py_wrap_subprogram import * class PythonWrapperModule(WrapperBase): main_template = '''\ #ifdef __cplusplus extern \"C\" { #endif #include "Python.h" #define PY_ARRAY_UNIQUE_SYMBOL PyArray_API #include "numpy/arrayobject.h" #include "numpy/arrayscalars.h" %(header_list)s %(typedef_list)s %(extern_list)s %(c_code_list)s %(capi_code_list)s %(objdecl_list)s static PyObject *f2py_module; static PyMethodDef f2py_module_methods[] = { %(module_method_list)s {NULL,NULL,0,NULL} }; PyMODINIT_FUNC init%(modulename)s(void) { f2py_module = Py_InitModule("%(modulename)s", f2py_module_methods); import_array(); if (PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "failed to load array module."); goto capi_err; } %(module_init_list)s return; capi_err: if (!PyErr_Occurred()) { PyErr_SetString(PyExc_RuntimeError, "failed to initialize %(modulename)s module."); } return; } #ifdef __cplusplus } #endif ''' main_fortran_template = '''\ %(fortran_code_list)s ''' def __init__(self, modulename): WrapperBase.__init__(self) self.modulename = modulename self.cname = 'f2py_' + modulename self.defined_cpp_code = [] self.defined_c_code = [] self.defined_types = [] self.defined_capi_codes = [] self.header_list = [] self.typedef_list = [] self.extern_list = [] self.objdecl_list = [] self.c_code_list = [] self.capi_code_list = [] self.module_method_list = [] self.module_init_list = [] self.fortran_code_list = [] self.list_names = ['header', 'typedef', 'extern', 'objdecl', 'c_code','capi_code','module_method','module_init', 'fortran_code'] self.isf90 = False return def add(self, block): if isinstance(block, BeginSource): for name, moduleblock in block.a.module.items(): self.add(moduleblock) #for name, subblock in block.a.external_subprogram.items(): # self.add(subblock) elif isinstance(block, Subroutine): PythonCAPISubProgram(self, block) elif isinstance(block, Function): fcode = block.subroutine_wrapper_code() self.fortran_code_list.append(fcode) wrapper_block = block.subroutine_wrapper() PythonCAPISubProgram(self, wrapper_block) elif isinstance(block, Module): self.isf90 = True for name,declblock in block.a.type_decls.items(): self.add(declblock) for name,subblock in block.a.module_subprogram.items(): self.add(subblock) elif isinstance(block, tuple([TypeDecl]+declaration_type_spec)): if isinstance(block, (TypeDecl, TypeStmt)): self.isf90 = True PythonCAPIType(self, block) else: raise NotImplementedError,`block.__class__.__name__` return def c_code(self): return self.apply_attributes(self.main_template) def fortran_code(self): return self.apply_attributes(self.main_fortran_template)