2009-12-18 10 views
6

Ho un progetto Python con moduli di estensione mutiple scritti in C, che comunicano con una libreria di terze parti. Tuttavia, a seconda dell'ambiente e delle opzioni dell'utente, alcuni moduli non dovrebbero essere costruiti e alcuni flag del compilatore dovrebbero essere abilitati/disabilitati. Il problema è che devo compilare l'elenco dei moduli di estensione prima di chiamare setup() e, idealmente, mi piacerebbe utilizzare una sottoclasse distutils.Command per gestire le opzioni utente. In questo momento ho un paio di opzioni:Configurazione dei moduli di estensione con distutils/setuptools

  1. richiedono un comando "python setup.py configure" essere eseguito prima di costruire i moduli, memorizzare le informazioni in un file di salamoia, e utilizzarlo per generare la lista estensioni prossima volta lo script funziona. Questo è il modo in cui il mio progetto funziona attualmente, il che sembra abbastanza sciocco.

  2. Maneggia manualmente le opzioni da sys.argv e le utilizza per creare l'elenco. Questa non è una soluzione a lungo termine, perché alla fine voglio eseguire alcuni script per controllare le impostazioni prima di costruire.

  3. Sottoclasse build_ext da distutils, eseguire la mia configurazione all'inizio del metodo run() (possibilmente utilizzando anche le opzioni inviate tramite (2)) e modificare direttamente self.distribution.ext_modules prima di creare. Temo che questo possa confondere setuptools, tuttavia, poiché si può supporre che l'elenco dei moduli di estensione sia corretto quando viene chiamato setup(). Significa anche che quando setup() viene chiamato con un comando diverso da build_ext, l'elenco dei moduli di estensione è vuoto.

C'è un modo preferito per farlo?

risposta

0

La mia esperienza con il cambiamento delle distutils è stata debole e tremolante, quindi tutto quello che posso offrire sono i puntatori. Dai un'occhiata a Numpy. Questo ha un intero sottomodulo (numpy.distutils) con modi per lavorare con (o aggirare) distutils. Altrimenti, chiedi alla mailing list di distutils.

0

avrei sottoclasse distutils.core.Distribution e passarlo con distutils.core.setup(distclass=CustomDistribution) - questo permette di accedere ai parametri della riga di comando nello stesso modo in cui la configurazione normale li ha, e si possono fare cose come regolare la lista estensioni nel metodo CustomDistribution.__init__. Ma sono d'accordo con Dalke, il modo di distutils è pieno di dolore ...

1

C'è un modo preferito per fare questo?

Dalla mia esperienza di lavoro con i moduli di altre persone, posso dire che non c'è certamente consenso sul modo corretto di farlo.

Ho provato e rifiutato sottoclassi di bit di distutils: l'ho trovato fragile e difficile da utilizzare su diverse versioni di Python e sistemi diversi.

Per il nostro codice, dopo aver provato i tipi di cose che stanno prendendo in considerazione, ho deciso di eseguire il rilevamento e la configurazione direttamente in setup.py prima della chiamata principale a setup(). Questo è certamente un po 'brutto, ma significa che qualcuno che sta cercando di compilare i tuoi file ha un posto per capire, ad es. perché il percorso di inclusione è sbagliato. (E certamente non hanno bisogno di essere esperti di interni di distutils).

0

Il comando config è progettato per essere sottoclasse e utilizzato da progetti con requisiti come il proprio.

Problemi correlati