essendo la versione di Python per Windows compilata con il MS Visual C++ e' necessario disporre di tale software (che non e' gratuitamente disponibile) per potere compilare delle estensioni?
la risposta e', fortunatamente, no.
In rete sono presenti un' elevato numero di tutorial su come scrivere estensioni Python utilizzando la versione di gcc messa a disposizione da MinGW o Cygwin, molti dei quali sono inesatti o inaccurati (per es. alcuni specificano la necessita' di installare SWIG); inoltre non ne ho trovato nessuno che spiegasse veramente il significato delle operazioni effettuate:
ed e' per questo motivo che provo a scriverene uno mio.
Il motivo per cui non e' possibile utilizzare direttamente gcc per scrivere estensioni Python e' che la libreria di importazione (cioe' il file libpythonXX.a nella sottodirectory libs della home directory del Python), necessaria per potere linkare il modulo di estensione, e' disponibile solo nella versione adatta ad essere utilizzata dal MSVC++.
Le librerie di importazione delle DLL sono apparentemente delle normali librerie ma contengono dei particolari file oggetto che dispongono delle informazioni che consentono di realizzare il linking a run-time.
E' necessario quindi creare un' altra versione della libreria di importazione che sia compatibile con MinGW/Cygwin:
a tale scopo si utilizza il programma pexport (disponibile qui o qui ) per generare la export list della DLL (cioe' una lista di tutte le funzioni della DLL che e' possibile chiamare direttamente in un programma) sotto forma di un file .def che, come suggerisce l'estensione, contiene la definizione delle funzioni esportate dalla DLL;
successivamente bisogna utilizzare il programma dlltool (che fa parte delle utility distribuite insieme a gcc) per generare, a partire dalla export list, la libreria di importazione.
Passando dalla teoria alla pratica, dobbiamo effettuare i seguenti passi:
- aprire una shell e posizionarsi nella directory C:\WINDOWS\system32 (oppure C:\WINNT\system32 nel caso di Windows NT), dove si trova la DLL del Python, ed eseguire il comando
- pexport.exe pythonXX.dll > pythonXX.def
- eseguire il comando
dlltool --dllname pythonXX.dll --def pythonXX.def --output-lib libpythonXX.a
- infine basta spostare la libreria di importazione appena ottenuta (ossia libpythonXX.a) nella sotto directory libs della directory home del Python.
python setup.py build --compiler=mingw32
python setup.py build --compiler=cygwin
[build]
compiler=mingw32
Una nota particolare va' riservata a Zope3.
Se si vuole installare Zope3 su Windows a partire dai sorgenti e' necessario sapere che:
- la procedura di installazione richiede la compilazione di alcuni moduli di estensione ed e' quindi necessario preparare la libreria di importazione come sopra descritto;
- lo script install.py, che provvede alla corretta installazione di Zope3 e dei suoi vari sotto componenti, non fa' altro che richiamare una estensione delle distutils; quindi tutto quello che e' stato appena detto continua ad essere valido: basta sostituire setup.py con install.py;
- rimane anche la possibilita' di modificare il file setup.cfg nello stesso modo sopra indicato.
Comments
era da un po' che ci sbattevo la testa, neanche avevo trovato il python25.dll perche' non immaginavo potesse essere fuori dalle cartelle python...
purtroppo ho ancora errori, pero' almeno ho capito meglio la questione.
grazie!!
Posted by: Vincenzo.2008/03/07 01:23:07.876 US/Eastern
Ho seguito la prima parte ed ho fatto:
Posted by: silvio.2009/07/14 12:52:03.620 GMT-4