2011-09-30 22 views
77

Potrebbe spiegare a me che cosa è la differenza tra chiamareQual è lo scopo del parametro -m?

python -m mymod1 mymod2.py args 

e

python mymod1.py mymod2.py args 

Sembra che in entrambi i casi mymod1.py viene chiamato e sys.argv è

['mymod1.py', 'mymod2.py', 'args'] 

Allora, qual è la -m per?

+0

Per favore correggimi se ho torto, ma '-m' sembra cercare' mymod1' nel percorso della libreria di default. Esempio: 'python -m SimpleHTTerver' funziona, mentre' python SimpleHTTerver' fallisce con 'impossibile aprire il file 'SimpleHTTerver': [Errno 2] Nessun file o directory simile. – Basj

+1

In realtà ho trovato la risposta più chiara: https://stackoverflow.com/questions/46319694/what-doesit-mean-to-run-library-module-as-a-script-with-the-m-option – Casebash

risposta

74

La prima riga della sezione di RationalePEP 338 dice:

Python 2.4 aggiunge la riga di comando -m per consentire ai moduli di essere posizionati utilizzando il modulo namespace Python per l'esecuzione come script. Gli esempi motivanti erano moduli di librerie standard come pdb e profile, e l'implementazione di Python 2.4 va bene per questo scopo limitato.

Quindi è possibile specificare qualsiasi modulo nel percorso di ricerca di Python in questo modo, non solo i file nella directory corrente. Hai ragione che python mymod1.py mymod2.py args ha esattamente lo stesso effetto. La prima linea degli stati Scope of this proposal sezione:

In Python 2.4, un modulo posizionato utilizzando -m viene eseguita

come se il suo nome era stata fornita sulla linea di comando.

Con -m più è possibile, come lavorare con moduli che fanno parte di un pacchetto, ecc Questo è ciò che il resto della PEP 338 è circa. Leggi per maggiori informazioni.

+31

Il mio uso preferito di '-m' è' python -m SimpleHTTerver'. Davvero utile quando ho bisogno di condividere alcuni file senza utilizzare un'unità flash USB. – arifwn

+6

@arifwn Eseguire Python3 richiede un leggero aggiornamento come 'python -m http.server' e questo è ancora fantastico! –

+7

TL; DR: 1) È possibile eseguire 'python -m pacchetto.subpackage.module' e verrà utilizzato il normale meccanismo di risoluzione, non è necessario indicare il file' .py' esatto. 2) È possibile fare importazioni relative dal modulo che viene eseguito, senza soluzioni alternative, perché il suo pacchetto verrà caricato lungo il percorso. 3) Le importazioni assolute si baseranno sulla tua directory corrente, non sulla directory in cui il file '.py' è (' '' 'è all'inizio di' sys.path', piuttosto che '/ path/to/my', se lo script è in/path/to/my/script.py'). – clacke