2009-07-26 10 views
5

Il manuale di Python dice che è possibile creare moduli per Python sia in C che in C++. Puoi approfittare di cose come classi e modelli quando usi C++? Non creerebbe incompatibilità con il resto delle librerie e con l'interprete?Posso usare le funzionalità di C++ estendendo Python?

+0

Dai un'occhiata alle risposte fornite a http://stackoverflow.com/q/10368141/151641 – mloskot

risposta

8

Non importa se l'implementazione delle funzioni di hook è implementata in C o in C++. In effetti, ho già visto alcune estensioni Python che fanno uso attivo di template C++ e persino della libreria Boost. Nessun problema. :-)

2

Quello che ti interessa è un programma chiamato SWIG. Genererà wrapper e interfacce Python per il codice C++. Lo uso con template, ereditarietà, namespace, ecc. E funziona bene.

+0

Se sei principalmente interessato al C++, SWIG non è sicuramente lo strumento che desideri utilizzare. È conveniente che comprenda il linguaggio C++ abbastanza bene da avvolgerlo se è una piccola parte di ciò su cui si sta lavorando, ma non può toccare Boost.Python per il supporto C++. –

+0

@Nick: ho esaminato la libreria Boost :: Python e non sono convinto che sia superiore. Tutta la magia di modelli e macro utilizzata da Boost può essere fragile e limita ciò che può essere fatto con il codice. –

+0

Perché il downvote? Questa è una risposta più utile della "risposta". –

3

Gli utenti boost hanno un buon modo automatizzato per eseguire il wrapping del codice C++ da usare con python.

Si chiama: Boost.Python

Si tratta di alcuni dei costrutti di C++ meglio di SWIG, metaprogrammazione particolare modello.

1

Dovresti essere in grado di utilizzare tutte le funzionalità del linguaggio C++. Il Extending Python Documentation (2.6.2) dice che si può utilizzare C++, ma menzioni Le seguenti avvertenze:

E 'possibile scrivere estensione moduli in C++. Si applicano alcune restrizioni . Se il programma principale (Python interprete) viene compilato e collegato dal il compilatore C, globale o statiche oggetti con i costruttori non possono essere utilizzato. Questo non è un problema se il programma principale è collegato dal compilatore C++ . Funzioni che saranno chiamato dall'interprete Python (in particolare, modulo inizializzazione funzioni) devono essere dichiarate usando extern "C". Non è necessario per racchiudere i file di intestazione Python in extern "C" {...} - usano questo modulo già se il simbolo __cplusplus è definito (tutti i compilatori C++ recenti definiscono questo simbolo).

La prima restrizione, "oggetti globali o statici con costruttori non possono essere utilizzati", ha a che fare con il modo in cui la maggior parte del compilatore C++ inizializza gli oggetti con questo tipo di durata di archiviazione. Ad esempio, si consideri il seguente codice:

class Foo { Foo() { } }; 

static Foo f; 

int main(int argc, char** argv) {} 

Il compilatore deve emettere il codice speciale in modo che il costruttore 'Foo' viene richiamato per 'f' prima principale Viene eseguito. Se si dispone di oggetti con durata di archiviazione statica nell'estensione Python e, l'interprete Python non viene compilato e collegato per C++, quindi questo codice di inizializzazione speciale non verrà creato.

La seconda restrizione, "Le funzioni che verranno chiamate dall'interprete Python (in particolare, le funzioni di inizializzazione del modulo) devono essere dichiarate utilizzando extern" C "", ha a che fare con il nome C++ di mangling. La maggior parte dei compilatori C++ manipola i loro nomi in modo che possano usare gli stessi linker forniti per gli strumenti C.Per esempio dire che hai avuto:

void a_function_python_calls(void* foo); 

C++ compilatore può convertire i riferimenti al nome 'a_function_python_calls' a qualcosa come 'a_function_python_calls @ 1VGA'. In tal caso è possibile ottenere un esterno non risolto quando si tenta di collegarsi alla libreria Python.

+0

Naturalmente, questi problemi sono coerenti con qualsiasi C al C++ legame, e non riguardano solo Pitone. Se controlli il processo di compilazione dell'interprete Python (ad esempio, stai incorporando ed estendendo, non solo estendendolo), non devi preoccuparti di questo, dato che puoi creare Python con un compilatore e un linker C++. –

Problemi correlati