2010-10-29 18 views
23

C'è un modo per abilitare un pacchetto ad essere eseguito come script? Per esempio:Esegui un pacchetto Python installato come script?

[~]# easy_install /path/to/foo.egg 
... 
[~]# python -m foo --name World 
Hello World 

Ho cercato di creare un file __main__.py dentro il mio pacchetto ma non è in esecuzione (sto usando Python 2.6). Il seguente errore viene generato:

foo is a package and cannot be directly executed 

La struttura del mio pacchetto è la seguente:

foo/ 
    setup.py 
    foo/ 
    __init__.py 
    __main__.py 

Esecuzione python -m foo.__main__ --name World funziona come previsto, ma io preferirei il precedente modo di esecuzione. È possibile?

+0

https://stackoverflow.com/questions/6630822/running-a-python-package – n611x007

+0

Link utili: https://www.reddit.com/r/Python/comments/2gki9e/python_apps_the_right_way_entry_points_and_scripts/ –

risposta

-3

finché il pacchetto si trova sul percorso python, aggiungere alla fine dello script.

if __name__ == "__main__": 
    call_script() 
$ python -m module_name

eseguirà il modulo es

 
python -m random 
+5

Questo non lo fa lavoro per i pacchetti. L'OP conosce l'opzione '-m' per i moduli. –

4

ritengo puo essere una limitazione di Python 2.6. L'ho provato e l'esecuzione di un pacchetto (sia in . o installato da un uovo con easy_install) con l'opzione -m funziona bene in 2.7, ma non in 2.6. Per esempio, sul mio sistema (Ubuntu) con un pacchetto di test chiamato pkg_exec nella directory corrente, e dove __main__.py stampa semplicemente sys.argv:

[email protected]:~/tmp/pkg_exec$ python2.6 -m pkg_exec 
/usr/bin/python2.6: pkg_exec is a package and cannot be directly executed 
[email protected]:~/tmp/pkg_exec$ python2.7 -m pkg_exec 
['/home/xx/tmp/pkg_exec/pkg_exec/__main__.py'] 

Inoltre, secondo the 2.7 docs:

Modificato nella versione 2.7 : Fornire il nome del pacchetto per eseguire un sottomodulo __main__.

26

Questa è una regressione in Python 2.6. Vedi issue2571:

la capacità di eseguire i pacchetti non è mai stato destinato, dal momento che facendo così interruzioni importazioni in una varietà di modi sottili. In realtà era un bug in 2.5 che era permesso a tutti, quindi 2.6 non solo lo ha disabilitato di nuovo, ma ha anche aggiunto un test per assicurarsi che rimanga disabilitato (2.4 correttamente rifiutato con un ImportError, proprio come fa 2.6).

avete alcune opzioni, è possibile sempre eseguirlo specificando principale:

$ python -m module.__main__ 

Oppure si può scrivere un wrapper script di shell che rileva la versione di Python e poi lo esegue nel diverso stile.

Oppure è possibile eseguire codice sulla riga di comando che consente di importare e quindi eseguire il modulo, e poi magari mettere che in uno script di shell:

$ python -c "import module; module.main()" 

Nei miei progetti propri della riga di comando ho sia il script di shell che cattura errori (python non viene installato, ecc.) ma lo script della shell eseguirà anche il codice di importazione e rileverà se i moduli necessari sono stati installati e richiede un errore (con un collegamento utile o un testo di installazione).

Problemi correlati