2011-09-30 25 views
77

Podría explicar a mí cuál es la diferencia entre llamar¿Cuál es el propósito del modificador -m?

python -m mymod1 mymod2.py args 

y

python mymod1.py mymod2.py args 

Parece que en ambos casos mymod1.py se llama y sys.argv es

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

Entonces, ¿cuál es el -m interruptor para?

+0

Corrígeme si me equivoco, pero '-m' parece buscar' mymod1' en la ruta predeterminada de la biblioteca. Ejemplo: 'python -m SimpleHTTPServer' funciona, mientras que' python SimpleHTTPServer' falla con 'no se puede abrir el archivo 'SimpleHTTPServer': [Errno 2] No existe dicho archivo o directorio'. – Basj

+1

De hecho, encontré la respuesta aquí más clara: https://stackoverflow.com/questions/46319694/what-does-it-mean-to-run-library-module-as-a-script-with-the-m-option – Casebash

Respuesta

74

La primera línea de la sección de RationalePEP 338 dice:

Python 2.4 añade el modificador de línea de comandos -m para permitir que los módulos se encuentran utilizando el espacio de nombres del módulo de Python para la ejecución como scripts. Los ejemplos motivadores fueron módulos de biblioteca estándar como pdb y perfil, y la implementación de Python 2.4 está bien para este propósito limitado.

Así que puede especificar cualquier módulo en la ruta de búsqueda de Python de esta manera, no solo los archivos en el directorio actual. Tiene razón en que python mymod1.py mymod2.py args tiene exactamente el mismo efecto. La primera línea de los estados Scope of this proposal sección:

En Python 2.4, un módulo ubicado utilizando -m se ejecuta como si su nombre de archivo se ha proporcionado en la línea de comandos.

Con -m más es posible, como trabajar con módulos que forman parte de un paquete, etc. De eso se trata el resto de PEP 338. Léelo para más información.

+31

Mi uso favorito de '-m' es' python -m SimpleHTTPServer'. Realmente útil cuando necesito compartir algunos archivos sin usar una unidad flash USB. – arifwn

+6

@arifwn Ejecutar Python3 requiere una pequeña actualización como 'python -m http.server' ¡y esto sigue siendo impresionante! –

+7

TL; DR: 1) Puede ejecutar 'python -m package.subpackage.module' y se usará la maquinaria de resolución normal, no es necesario que indique el archivo' .py' exacto. 2) Es posible realizar importaciones relativas desde el módulo que se ejecuta, sin soluciones provisionales, porque su paquete se cargará en el camino. 3) Las importaciones absolutas se basarán en su directorio actual, no en el directorio donde está el archivo '.py' (' '' 'está a la cabeza de' sys.path', en lugar de '/ path/to/my', si el script está en '/ path/to/my/script.py'). – clacke

Cuestiones relacionadas