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?
risposta
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. :-)
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.
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++. –
@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. –
Perché il downvote? Questa è una risposta più utile della "risposta". –
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.
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.
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++. –
- 1. Rails engine estendendo le funzionalità
- 2. Posso usare le astrazioni di libreria in python?
- 3. ExtJS - creazione di un pacchetto estendendo le classi in un'app
- 4. Posso usare C++ 11 con Xcode?
- 5. Posso usare python con giraph?
- 6. Come posso usare la classe C++ in Python?
- 7. Posso utilizzare tutte le funzionalità di C# 4.0 in un progetto destinato a .Net 3.5?
- 8. Posso usare le mie vecchie librerie C# con WinJS?
- 9. Posso usare le espressioni regolari con String.Replace in C#?
- 10. Sono stupido? Come posso utilizzare le funzionalità XAML2009
- 11. Disponibilità di funzionalità C++ 11
- 12. Quale metodo posso usare al posto di __file__ in python?
- 13. Cercando di conoscere le nuove funzionalità asincroni in C#
- 14. Come utilizzare le funzionalità di C++ 11 con Autoconf?
- 15. Disabilitare le funzionalità di C++ 0x in VC 2010?
- 16. Perché dovrei usare le classi in python?
- 17. Come posso utilizzare le ultime funzionalità di C# v6 nei modelli T4?
- 18. Non posso usare unichr in Python 3.1
- 19. Posso usare Artifactory con Python PIP?
- 20. ActiveSupport :: Prevenendo ed estendendo il modello mongoid
- 21. veloce python numpy dove funzionalità?
- 22. Funzionalità di .rdata simili in Python?
- 23. Quali sono le funzionalità considerate come python avanzato?
- 24. Come posso rendere più breve questo codice di template variadic utilizzando le funzionalità di C++ 14 e C++ 1z?
- 25. Posso usare Python 3 super() in Python 2.5.6?
- 26. Variabile globale Python e funzionalità di classe
- 27. Controllo funzionalità C++ 11
- 28. Python: Posso usare le variabili di classe come blocchi di thread?
- 29. Possibile usare Mathematica da altri linguaggi di programmazione (python/C#)?
- 30. Come posso usare bigint con C#?
Dai un'occhiata alle risposte fornite a http://stackoverflow.com/q/10368141/151641 – mloskot