2012-06-22 12 views
8

que tienen un módulo que tiene la costumbre¿Cómo importar un módulo como __main__?

if __name__ == '__main__': 
    do stuff... 

idioma.

Me gustaría importar eso de otro módulo y engañarlo para que ejecute ese código. ¿Hay alguna forma de hacer esto?

Debo mencionar, por razones que no voy a entrar aquí, no estoy en condiciones de cambiar el código en el módulo importado. Necesito de alguna manera modificar el procedimiento de importación para que su nombre sea principal cuando se importe, quizás usando ihooks o similar.

Respuesta

8

Hay, ejecute la secuencia de comandos en lugar de importarlo. Pero considero que esta es una solución extremadamente hackish.

Sin embargo, el patrón ideal sería:

def do_stuff(): 
    ... stuff happens ... 

if __name__ == '__main__': 
    do_stuff() 

esa manera se puede hacer:

from mymodule import do_stuff 
do_stuff() 

EDITAR: respuesta después de la clarificación de no ser capaz de editar el código del módulo.

Nunca recomendaría esto en ningún código de producción, esta es una solución de "use a riesgo propio".

import mymodule 

with open(os.path.splitext(mymodule.__file__)[0] + ".py") as fh: 
    exec fh.read() 
+0

Gracias, pero he aclarado la pregunta: no puedo modificar el módulo importado para tener todo el código en una función do_stuff así. – xorsyst

3

Ponga ese código en una función y llámelo desde el módulo que lo está importando también.

def stuff(): 
    ... 

if __name__ == '__main__': 
    stuff() 

Y luego, en el módulo que va a importar en:

import module 
module.stuff() 
+0

Gracias, pero he aclarado la pregunta - No puedo modificar el módulo importado tener todo el código en una función de cosas por el estilo . – xorsyst

0

Póngalo en una función:

def _main(): 
    do stuff 

if __name__ == '__main__': 
    main() 
+0

Gracias, pero he aclarado la pregunta: no puedo modificar el módulo importado para tener todo el código en una función principal como esa. – xorsyst

0

Código en una estrofa principal por lo general no tiene sentido para ejecutar directamente. Si desea ejecutarlo, utilice subprocess para ejecutarlo en otro intérprete de Python.

+0

Gracias. En esta ocasión lo hace, y ejecutarlo con un subproceso no resuelve mi problema. – xorsyst

0

Aquí es un ejemplo de un módulo principal en Python:

#! /usr/bin/env python 
import sys 
import os 

def main(arg1, arg2, arg3): 
    print(arg1, arg2, arg3) 

if __name__ == "__main__": 
    main(*sys.argv) 

Pero también se pueden incluir

def main(): 
    #The module contains Python code specific to the library module, 
    #like tests, and follow the module with this: 

if __name__ == "__main__": 
    main(*sys.argv) 

en cualquier módulo que desea ejecutar como principal.

Por ejemplo, si tiene un módulo de biblioteca, siempre puede usar esta construcción para ejecutar algo específico como pruebas.

+0

Gracias, pero he aclarado la pregunta: no puedo modificar el módulo importado para tener todo el código en una función principal como esa. – xorsyst

7

Como se señaló en las otras respuestas, esta es una mala idea, y debería resolver el problema de otra manera.

pesar de todo, la forma en Python lo hace es la siguiente:

import runpy 
result = runpy._run_module_as_main("your.module.name")) 
Cuestiones relacionadas