2010-05-19 16 views

risposta

5

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. :-)

+0

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

+0

@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). –

+1

Oppure, se l'estensione include qualcosa che è già presente su queste piattaforme, utilizzare i tipi di codice anziché un modulo di estensione. – fraca7

3

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.

+0

Grazie, esaminerò il metodo di caricamento dinamico. – amoffat

Problemi correlati