2012-02-08 1 views
5

Ho due pacchetti che installano pacchetti diversi con lo stesso nome. Sono entrambi "pacchetti" in quanto dispongono di file setup.py di livello superiore che specificano package=['foo'] nel comando setup.Python: due pacchetti con lo stesso nome; come si specifica quale viene caricato?

Se installo utilizzando distutils.core, l'ultimo da installare sovrascrive quello precedente (ma penso che non si sovrascrivere a meno che i file .py abbiano tutti lo stesso nome?). Se installo utilizzando setuptools, i due pacchetti vengono installati in uova diverse.

Un'opzione sarebbe quella di impostare esplicitamente sys.path prima di importare il nome del pacchetto; questo sembra "non-pitonico" e piuttosto sporco.

Supponendo di avere questi due pacchetti con lo stesso nome installati in diversi eggs da setuptools, come si specifica quale viene importato?

+0

per curiosità, quali pacchetti sono? –

+2

è abbastanza antipolitico avere 2 pacchetti con lo stesso nome installati in primo luogo, IMO. – geoffspear

+0

http://pypi.python.org/pypi/pydns e http://pypi.python.org/pypi/dnspython vengono in mente. Uno usa il DNS mentre altri usa dns come nome. – Zart

risposta

1

Setuptools guide menzioni --Supporto versione (-m) interruttore che rimuove pacchetto da sys.path completamente. Devi usare pkg_resources.require ('pacchetto == versione') nel tuo codice il prima possibile per lasciarlo risolvere sys.path. Questo consiglio è ciò che easy_install stampa sempre quando si utilizza -m.

Ma non è possibile averli entrambi importati contemporaneamente (a meno che non siano progettati per farlo utilizzando namespace packages).

+0

Questa è una bella soluzione, ma sembra che funzioni solo con il comando 'sviluppa'; c'è qualche alternativa per il comando 'install'? Lo sviluppo di – keflavich

+0

è solo un tipo specifico di installazione sul posto. -m funziona anche per l'installazione. Io uso spesso "easy_install -zmaxd/output/directory nomepacchetto" per recuperare il pacchetto e le sue dipendenze da pypi e costruirle tutte in uova.Poi li installo in virtual env o qualsiasi cosa con "venv/bin/easy_install -f/output/dir nomepacchetto", risparmiando un sacco di tempo su download/build. pip non supporta però le uova binarie. – Zart

+0

Lo fa? Se provo 'python setup.py install -m' o' pip installa [nome] -m' (o inverte l'ordine di installazione di/-m), ottengo 'errore: opzione -m non riconosciuta'. Funziona solo con 'easy_install', che immagino sia una soluzione alternativa, ma cosa succede se qualcuno usa pip? – keflavich

0

Penso che il modo migliore per ovviare al problema, sarebbe quello di cambiare il nome della directory di livello superiore, a meno che altri pacchetti non dipendano da quel pacchetto.

È possibile eseguire questa operazione modificando il file setup.py o semplicemente modificare direttamente la cartella dei nomi nei pacchetti del sito. L'uovo è solo meta dati.

Per quanto riguarda l'impostazione sys.path, è preferibile utilizzare il modulo del sito, creando un file .pth. Quando istanziato, qualsiasi percorso situato in quel file verrà aggiunto alla "testa" del percorso Python.

Sono questi due pacchetti diversi e la denominazione è una coincidenza, o sono semplicemente rami della stessa?

+0

Due rami dello stesso; diversi rami necessari per diversi compiti. – keflavich