Sono un'estensione noob. Quello che voglio fare è creare un'estensione che non richieda l'installazione di altre librerie. È impossibile perché l'estensione deve collegarsi a una versione specifica di libpython in fase di runtime?Perché le estensioni Python sono condivise con le librerie? È possibile creare una libreria collegata staticamente?
risposta
Non si può fare un modulo di estensione collegata in modo statico, perché Python deve caricare in modo dinamico in fase di esecuzione e perché (come si motivato) il modulo ha bisogno di collegare in modo dinamico contro libpython.
È possibile compilare la propria versione personalizzata di Python con l'estensione collegata staticamente all'interprete. Di solito è più un problema che ne vale la pena.
Perché si desidera creare un'estensione collegata in modo statico? Se abbiamo più informazioni sui tuoi obiettivi, potremmo essere in grado di aiutarti a raggiungerli in un modo diverso.
Benvenuti in StackOverflow. :-)
Penso che tu stia mescolando le cose. Non vuoi che l'estensione sia collegata staticamente nell'interprete (che è possibile ma ingombrante dal momento che comporta la ricostruzione di un interprete personalizzato), vuoi che la tua estensione non sia collegata a pythonxx.dll o che vi sia collegata staticamente. Non è possibile; la tua estensione e l'interprete python avranno ciascuna la propria copia di variabili globali, ad esempio, che è Bad.
C'è un altro approccio, che consiste nel determinare quali versioni Python sono disponibili in fase di esecuzione e utilizzare dinamicamente l'API Python/C caricando la DLL Python tramite LoadLibrary (Windows) o dlopen (Linux/etc), quindi decidendo in fase di esecuzione sulle firme dei metodi a seconda della versione, ecc. Molto ingombrante. Per un esempio di questo tipo di manipolazione in Delphi, vedere PythonForDelphi:
http://www.atug.com/andypatterns/pythonDelphiTalk.htm
io non sono a conoscenza di qualsiasi altro progetto che avrebbe fatto questo.
Grazie, esaminerò il metodo di caricamento dinamico. – amoffat
- 1. Come combinare le librerie condivise?
- 2. Come sono collegate le variabili globali nelle librerie condivise?
- 3. FFmpeg non compila con le librerie condivise
- 4. Perché gcc forza il PIC per le librerie condivise x64?
- 5. È possibile creare estensioni a python/php/perl con Go?
- 6. È possibile collegare staticamente una libreria Crystal a da C?
- 7. Perché le librerie Python non sono fornite come pyc?
- 8. come includere le librerie condivise precompattate in apk con eclissi
- 9. Posso creare una libreria condivisa collegando le librerie statiche?
- 10. Perché le varie estensioni JPEG?
- 11. In quale ordine ld-linux.so cerca le librerie condivise?
- 12. È possibile "nascondere" le estensioni della lingua?
- 13. LD_PRELOAD equivalente per Windows per precaricare le librerie condivise
- 14. Miscelazione di librerie statiche e librerie condivise
- 15. SQLAlchemy con Python 3.2: le estensioni C non sono supportate?
- 16. Collegamento a più librerie condivise che sono tutte collegate a una libreria statica comune
- 17. Cosa succede alle variabili statiche quando le librerie sono collegate staticamente
- 18. Dilemma sulle librerie condivise su Unix
- 19. Librerie condivise opzionali
- 20. Librerie condivise Linux C++
- 21. Dalvik compilato automaticamente non carica le librerie condivise
- 22. Come collegare staticamente le librerie per un ClassLibrary C#?
- 23. Makefile per librerie condivise?
- 24. Se clang ++ e g ++ sono ABI incompatibili, cosa viene usato per le librerie condivise in binario?
- 25. È possibile collegare una libreria statica a Java tramite JNI?
- 26. Come posso includere una libreria collegata staticamente nel mio progetto Eclipse C++?
- 27. È possibile condividere le preferenze condivise tra diverse applicazioni Android?
- 28. Automake e librerie condivise standard
- 29. Caricamento dinamico di librerie condivise Linux?
- 30. Come sono importati i moduli Python (che sono librerie condivise) senza un file .py?
Grazie Daniel, per la risposta e il benvenuto :) Immagino che sto cercando di capire il modo migliore per distribuire un'app (che ha estensioni C) alle piattaforme principali senza richiedere la compilazione al momento dell'installazione. – amoffat
@Andrew: Ah! Perché non l'hai detto? :) Usa il pacchetto di distribuzione (http://pypi.python.org/pypi/distribute) e crea le uova ('setup.py bdist_egg'). Per Windows, crea un programma di installazione ('setup.py bdist_wininst'). Fai attenzione ai problemi di incompatibilità Unicode (vedi http://bugs.python.org/issue8654). –
Oppure, se l'estensione include qualcosa che è già presente su queste piattaforme, utilizzare i tipi di codice anziché un modulo di estensione. – fraca7