Wykład 14.
● Rozszerzenia Pythona (C API)
● Osadzanie Pythona
● Jython
● IronPython
Moduł z funkcją obliczającą średnią arytmetyczną elementów listy
#include <python2.4/Python.h>
extern PyObject * mean(PyObject *, PyObject *); PyObject * mean(PyObject * self, PyObject * args)
{
int suma = 0;
int n, i;
PyObject * res;
PyObject * item;
PyObject * lista;
lista = PySequence_ITEM(args, 0);
if (!PyList_Check(lista)) printf("Nie jest listą\n");
lista = PySequence_ITEM(args, 0);
n = PyList_Size(lista);
for (i = 0; i < n; i++) {
item = PyList_GetItem(lista, i);
if (!PyInt_Check(item)) continue;
suma += PyInt_AsLong(item);
}
res = Py_BuildValue("i", suma/n);
Py_INCREF(res);
return res;
}
static PyMethodDef modulik[] = {
{ "mean", mean, METH_VARARGS },
{ NULL, NULL }
};
void initmodulik(void) {
Py_InitModule("modulik", modulik);
}
Zagadnienia:
● Dostęp do obcych typów
● Przekazywanie argumentów i zwracanie
wartości
● Tworzenie nowych wartości
● Wyjątki
● Zarządzanie pamięcią
Wszystkow Pythonie jest obiektem
● Dostęp do elementów
PyObject* PyObject_GetItem(
PyObject *o, PyObject *key)
int PyObject_SetItem(
PyObject *o, PyObject *key, PyObject *v)
● Zamiany na string
PyObject* PyObject_Str(PyObject *o)
● Rozmiar
Py_ssize_t PyObject_Length(PyObject *o)
int PyNumber_Check( PyObject *o)
PyObject* PyNumber_Add(
PyObject *o1, PyObject *o2)
PyObject* PySequence_GetItem(
PyObject *o, Py_ssize_t i)
PyObject* PySequence_ITEM(
PyObject *o, Py_ssize_t i)
int PySequence_SetItem(
PyObject *o, Py_ssize_t i, PyObject *v)
Podobnie jak w sekwencjach
int PyList_Insert(PyObject *list,
Py_ssize_t index, PyObject *item)
int PyList_Append(PyObject *list,
PyObject *item)
PyObject* PyInt_FromLong( long ival)
PyObject* Py_False
PyObject* Py_True
PyObject* PyList_New( Py_ssize_t len)
PyObject* PyString_FromString( const char *v)
● Każdy obiekt ma licznik odwołań zwiększany za każdym przypisaniem
● Jeśli licznik jest równy zero obiekt jest usuwany z pamięci
● W programach w C trzeba dbać o aktualizację licznika
void Py_INCREF(PyObject *o)
void Py_DECREF(PyObject *o)
res = Py_BuildValue("i", suma/n);
Py_INCREF(res);
return res;
PyObject* Py_None
---
Py_INCREF(Py_None);
return Py_None;
---
Py_RETURN_NONE
Argumenty wywołania przekazywane są jako
pojedyncza sekwencja, więc można kolejno je
odczytywać.
Py_ssize_t PySequence_Size(PyObject *o)
PyObject* PySequence_GetItem(
PyObject *o, Py_ssize_t i)
int PyArg_ParseTuple(Py_Object *, const char *, ...)
int i;
int j;
const char * str;
PyArg_ParseTuple(arg, “i s”, &i, &j, &str);
● int PyErr_Occurred()
● Stałe dla typowych wyjątków
item = PyObject_GetItem(dict, key);
if (item == NULL)
if (!PyErr_ExceptionMatches(PyExc_KeyError)) PyErr_Clear();
PyObject* PyErr_SetFromErrno(PyObject *type)
Jak skompilować i zainstalować własną bibliotekę
from distutils.core import setup, Extension
module1 = Extension('modulik',
sources = ['test.c'])
setup (name = 'MyPackage',
version = '1.0',
description = 'Pakiet demonstracyjny',
ext_modules = [module1])
$ python setup.py build
$ python setup.py instal
Py_Initialize();
PyRun_SimpleString("i = 2");
PyRun_SimpleString("i = i*i\nprint i"); Py_Finalize();
Py_Initialize();
FILE * f = fopen("test.py", "r"); PyRun_SimpleFile(f, "co to");
Py_Finalize();
gcc -lpython2.4 test.c
java jython_21
Exception in thread "main"
java.lang.ClassFormatError: Extra bytes at the end of class file jython_21
mono ipy.exe
mono ipy.exe plik.py
Dziś nie będzie żadnego zdjęcia