2011-12-01 22 views
8

no pude encontrar respuesta después de haber leído todo lo siguiente:¿Cómo saber si el script de Python se ejecutó utilizando la opción -m del intérprete?

Justificación:
Cuando un script de prueba que usa importaciones relativas se está ejecutando sin -m opción, podría imprimir un mensaje de advertencia en lugar de dejar al usuario con el rastreo estándar que lleva a la excepción ValueError: Attempted relative import in non-package. Sin saber esto puedo detectar esta excepción y solo sugieren que falta de -m opción podría ser la razón del error.

+1

¿Para qué lo necesitas? ¿Podría darnos algún ejemplo o un caso de prueba en el que esta necesidad se haga aparente? – jsalonen

Respuesta

2

Otra observación es que __package__ se establece en None al ejecutar el script directamente y al nombre del paquete cuando usa -m (usando la cadena vacía cuando el módulo no está incluido en ningún paquete, por lo que sigue siendo diferente de None).

+1

¡Agradable! No es solo observación, ya que ** está ordenado ** por [PEP 366 módulo principal de importaciones relativas explícitas] (http://www.python.org/dev/peps/pep-0366/). –

3

Descargo de responsabilidad: esto es solo una observación, no lo he visto en los documentos, por lo que es probablemente dependiente de la implementación y puede no ser consistente en las diferentes versiones de Python.

he notado que cuando se llama a un script usando una opción -m una variable llamada __loader__ se añade al espacio de nombres, por lo que en la parte superior de la secuencia de comandos se puede comprobar por la existencia de esa variable:

if '__loader__' in globals(): 
    # called with -m 

Para seguridad extra, se podría comprobar para ver si __loader__ es una instancia de pkgutil.ImpLoader:

if '__loader__' in globals() and __loader__.__class__.__name__ == 'ImpLoader': 
+0

Este ** es ** en los documentos del módulo 'runpy'; * Las variables globales especiales '__name__',' __file__', '__name__' y' __package__' se establecen en el diccionario global antes de que se ejecute el código del módulo (Tenga en cuenta que este es un conjunto mínimo de variables; otras variables pueden establecerse implícitamente como un detalle de implementación del intérprete). * Sin embargo, '__loader__' es algo genérico y nunca sabemos qué más podría establecerlo algún día ... –

+1

+1 Esta es una solución perfectamente razonable. –

+0

@RaymondHettinger ¿Hay alguna razón por la que no haya una variable global ** única ** establecida en esta situación? –

Cuestiones relacionadas