import ctypes # Evocando a caixa de mensagens do Windows # Os argumentos são: janela pai, mensagem, # título da janela e o tipo da janela. # A função retorna um inteiro, que # corresponde a que botão foi pressionado i = ctypes.windll.user32.MessageBoxA(None, 'Teste de DLL!', 'Mensagem', 0) # O resultado indica qual botão foi clicado print i import ctypes # msvcrt é a biblioteca com a maioria das funções # padrões da linguagens C no Windows # O Windows coloca automaticamente # a extensão do arquivo clib = ctypes.cdll.msvcrt # Cria um buffer para receber o resultado # a referência para o buffer será passada para # a função, que preenche o buffer com o resultado s = ctypes.c_buffer('\000', 40) # sscanf() é uma função que extrai valores # de uma string conforme uma mascara clib.sscanf('Testando sscanf!\n', 'Testando %s!\n', s) # Mostra o resultado print s.value import ctypes # Carrega a biblioteca padrão C no Linux # A extensão do arquivo precisa passada # para a função LoadLibrary() clib = ctypes.cdll.LoadLibrary("libc.so.6") # Cria um buffer para receber o resultado s = ctypes.c_buffer('\000', 40) # Evoca a função sprintf clib.sprintf(s, 'Testando %s\n', 'sprintf!') # Mostra o resultado print s.value // Arquivo: mymodule.c // Python.h define as estruturas do Python em C #include // No Python, mesmo os erros sao objetos static PyObject *MyModuleError; // Chamando a funcao "system" em C static PyObject * mymodule_system(PyObject *self, PyObject *args) { const char *command; int sts; // "PyArg_ParseTuple" desempacota a tupla de parametros // "s" significa que ele deve identificar uma string if (!PyArg_ParseTuple(args, "s", &command)) // retornando NULL gera uma excessao // caso falte parametros return NULL; // chamando "system": sts = system(command); // "Py_BuildValue" gera objetos que o Python conhece // "i" significa inteiro return Py_BuildValue("i", sts); } // Tabela que o Python consulta para resolver // os metodos do modulo e pode ser usado // tambem para gerar a documentacao // por instrospeccao: dir(), help(),... static PyMethodDef MyModuleMethods[] = { {"system", mymodule_system, METH_VARARGS, "Executa comandos externos."}, // Fim da tabela: {NULL, NULL, 0, NULL} }; // inicializacao do modulo: PyMODINIT_FUNC initmymodule(void) { // O modulo tambem e' um objeto PyObject *m; // "Py_InitModule" precisa do nome do modulo e da // tabela de metodos m = Py_InitModule("mymodule", MyModuleMethods); // Erros... MyModuleError = PyErr_NewException("mymodule.error", NULL, NULL); // "Py_INCREF" incrementa o numero de referencias do objeto Py_INCREF(MyModuleError); // "PyModule_AddObject" adiciona um objeto ao modulo PyModule_AddObject(m, "error", MyModuleError); } # Arquivo: setup.py from distutils.core import setup, Extension mymodule = Extension('mymodule', sources = ['mymodule.c']) setup(name = 'MyPackage', version = '1.0', description = 'My Package', ext_modules = [mymodule]) // Arquivo: py_call.c // Python.h com as definicoes para // interagir com o interpretador #include int main() { // Inicializa interpretador Python Py_Initialize(); // Executando codigo Python PyRun_SimpleString("import os\n" "for f in os.listdir('.'):\n" " if os.path.isfile(f):\n" " print f, ':', os.path.getsize(f)\n"); // Finaliza interpretador Python Py_Finalize(); return 0; }