2010-05-20 17 views
21

Dire che il pacchetto python A richiede B, C e D; c'è un modo per elencare A → B C D senza caricarli?
Requires nei metadati (yolk -M A) sono spesso incompleti, grr.
Uno può scaricare A.tar/A.egg, quindi guardare attraverso A/setup.py, ma alcuni di questi sono piuttosto cruenti.elenca le dipendenze del pacchetto python senza caricarle?

(avrei pensato che ottenere le dipendenze almeno di primo livello potrebbe essere meccanizzata; anche una soluzione al 98% sarebbe meglio di download valanga.)

Una questione collegata: pip-upgrade-package-without-upgrading-dependencies

risposta

28

Snakefood

sfood -fuq package.py | sfood-target-files 

presenterà l'elenco delle dipendenze.

`-f` tells sfood to follow dependencies recursively 
`-u` tells sfood to ignore unused imports 
`-q` tells sfood to be quiet about debugging information 

per filtrare i moduli della libreria standard, è possibile utilizzare

sfood -fuq package.py | sfood-filter-stdlib | sfood-target-files 

Come avete già notato, se ci sono altre directory che desideri venga ignorato, è anche possibile utilizzare il sfood -I bandiera.

+0

sembra ragionevole, +1. sfoodxx -I /Library/...python2.6 (mac) non filtra le importazioni standard sys, os.path, ecc.? – denis

+0

@Denis: Usa 'sfood-filter-stdlib' per rimuovere le voci dalla libreria standard di Python. Modificherò la mia risposta per includere questo ... – unutbu

+1

sfood-filter-stdlib ha '/ usr/lib/python' cablato in, e non funziona per importazioni sfood. Chiedo all'autore ... Kevin Teague, "Voglio un pony" http://groups.google.com/group/django-developers/msg/5407cdb400157259 è una straordinaria panoramica dei metodi di imballaggio nel 2008.) – denis

12

modulefinder dal lib standard di

Nuovo nella versione 2.3.

Questo modulo fornisce una ModuleFinder classe che può essere utilizzato per determinare l'insieme di moduli importati da uno script . modulefinder.py può anche essere eseguito come script, fornendo il nome file di uno script Python come argomento, dopo il quale verrà stampato un rapporto dei moduli importati.

Non sono sicuro che rispetti i requisiti richiesti per il caricamento dei moduli. From here:

modulefinder ispezione uso bytecode per trovare le dipendenze, e quindi è esente da effetti collaterali che possono essere causati importando moduli essendo studiato.

Altri suggerimenti circa l'uso di pylint o Gui2exe here

+2

modulefinder funziona ma mostrerà un sacco di cose inutili e dipendenze indirette (dipendenze che potrebbero essere utilizzate dalle tue dipendenze, ma in realtà non lo sono). Puoi trovare uno script di esempio che ho fatto usando modulefinder qui: https://gist.github.com/lrq3000/6175634 E uno script alternativo che usa un approccio di analisi AST qui (e che funziona meglio per me): https: // gist .github.com/lrq3000/6175522 – gaborous

5

Se dal pacchetto si intende un pacchetto pip installato (e non una directory con un __init__.py), quindi è possibile utilizzare il pacchetto Python chiamato pip . Ad esempio:

def get_all_package_dependencies(): 
    """Return dictionary of installed packages to list of package dependencies.""" 
    return { 
     dist.key: [r.key for r in dist.requires()] 
     for dist in pip.get_installed_distributions() 
    } 
+0

Vedo un pacchetto sul Web e desidero conoscere i suoi dettagli. C'è 'pip install --no-deps', quindi scavare intorno ... o ci sono nuovi comandi pip per i list-deps? (I file dei requisiti si trovano nella maggior parte dei casi non proprio lì.) – denis

+0

e pprint possono essere utilizzati per stampare in modo ottimale l'output prodotto da snippet sopra – binithb

Problemi correlati