2012-04-18 11 views
18

Sto esplorando python. Sono curioso di legare il pitone. Qualcuno potrebbe spiegare, come è possibile che tu possa avere accesso alle librerie C da Python.collegamenti Python, come funziona?

+1

Quale parte del [extemb] (http://docs.python.org/extending/index.html) non hai capito? –

+1

Ti suggerisco di fare una ricerca su Google per "Python C binding". – steveha

+2

"Sto esplorando python."Imparare tutto su Python è una grande cosa, ma probabilmente dovresti avere una buona comprensione del modello Python prima di guardare troppo in profondità i binding C. Capirai come l'apparato del servosterzo funzioni molto meglio una volta che sai guidare –

risposta

25

Esistono diversi modi per chiamare il codice scritto in C da Python.

Innanzitutto, c'è il modulo ctypes nella libreria standard. Permette di caricare una libreria a collegamento dinamico (DLL su Windows, librerie condivise .so su Linux) e chiamare le funzioni da queste librerie, direttamente da Python. Tali librerie sono solitamente scritte in C.

In secondo luogo, nel caso di CPython è presente l'API Python/C. Può essere utilizzato in due modi principali:

Una libreria di collegamento dinamico può essere scritta in C in modo tale che CPython lo tratterà come un modulo (sarà possibile importarlo nei programmi Python). L'API Python/C consente alla libreria di definire funzioni scritte in C ma ancora richiamabili da Python. L'API è molto potente e offre funzioni per manipolare tutti i tipi di dati Python e accedere all'interfaccia dell'interprete.

Il secondo modo di utilizzare l'API C è incorporare Python in un programma scritto in C. approccio alla biblioteca. L'API consente inoltre al programma di eseguire script che possono quindi importare e utilizzare i moduli incorporati. Questo può essere usato per creare un sistema plug-in basato su Python.

"Bindings" sono implementati come una libreria Python pura che utilizza i ctypes o come una libreria a collegamento dinamico che utilizza API Python/C. La seconda opzione viene talvolta utilizzata con strumenti come SWIG che semplificano l'attività avendo cura di generare il codice "boiler-plate" o Boost.Python che fornisce un'API C++ sopra l'API Python/C che semplifica l'interfaccia con il codice C++.

leggere oltre: Foreign Function Interface

6

La risposta è semplice, l'interprete Python (CPython) è scritto in C e può chiamare dinamicamente altre librerie C, il modulo di estensione C o il codice C incorporato possono essere facilmente richiamati da qualsiasi altro codice C.

CPython consente hook speciali in modo che possa chiamare altro codice C o essere richiamato da un altro codice C. Non ha nemmeno bisogno di essere C, qualsiasi linguaggio che compili al codice nativo e abbia le stesse convenzioni di chiamata.

Per un semplice caso, si consideri creare un programma chiamato mython, che può caricare qualsiasi libreria condivisa e tenta di chiamare una funzione run ad es.

lib = dlopen("mylib.so", RTLD_LAZY); 
func = dlsym(lib, "run"); 
(*func)(); 

Quindi, in modo che avete caricato un modulo e chiamato il suo codice, CPython lo fa, ma in modo più complesso, fornendo interfacce e gli oggetti migliori per passare intorno, in più ci sono altre complessità coinvolti di gestione della memoria, gestione dei thread ecc.

Quindi la piattaforma di implementazione Python deve corrispondere al linguaggio in cui viene estesa, ad es. CPython non è estensibile in Java, ma l'implementazione Java di Python chiamata Jython può essere estesa in Java e analogamente l'implementazione .NET IronPython può essere estesa nei linguaggi .Net.

+2

Un sacco di cose è scritto in C. Ma molte cose scritte in C * non sono * estensibili in C. Ciò che rende Python speciale ? –

+0

@Anurag È corretto che python non sia estensibile a, per esempio, Java? – ashim

+0

@ IgnacioVazquez-Abrams vedi modifica –