2006/12/11 15:01:34.823 US/Eastern

Estensioni Python in Windows (senza pagare Microsoft)

Chi programma in Python e deve usare Windows  per motivi di lavoro, si trova spesso davanti alla necessita' di scrivere estensioni al linguaggio in C/C++ e a doverle compilare per poi poterle effettivamente utilizzare, ed il dilemma davanti al quale si trova e' il seguente:
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.
Ora e' possibile utilizzare il gcc per compilare le estensioni al Python ma, nel caso in cui si stia installando un modulo utilizzando le distutils, e' necessario "dichiarare" esplicitamente che si vuole utilizzare tale compilatore passando l'opzione --compiler:
  • python setup.py build --compiler=mingw32
oppure
  • python setup.py build --compiler=cygwin
e' possibile evitare di passare l'opzione dalla riga di comando creando o modificando  il file setup.cfg specificando la configurazione desiderata, ad es:

[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.
Per approfondire quanto qui' brevemente descritto potete fare riferimento ai seguenti link:

Posted by: swarzy.2006/12/11 15:01:34.823 US/Eastern
Tags: gcc gnu python zope3 windows mingw cygwin zope microsoft | Permalink | Comments (1)

Comments

complimenti, articolo veramente completo e molto piu' chiaro degli altri trovati in rete!!
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

Post a comment





The CAPTCHA image

Please enter the letters shown in the image in the following text box. Provided by Captchas.net