Digamos que tengo dos scripts python A.py
y B.py
. Estoy buscando una manera de funcionar B desde dentro de una de una manera tal que:Ejecutar programa python desde otro programa python (con ciertos requisitos)
- B cree que es
__main__
(para que el código en un bloque deif __name__=="__main__"
en B se ejecutará) - B no es en realidad
__main__
(para que no sobrescriba, por ejemplo, la entrada"__main__"
en sys.modules) - Las excepciones aumentadas dentro de B se propagan a A (es decir, podrían capturarse con una cláusula
except
en A). - Esas excepciones, si no se detecta, generar una línea números de rastreo de referenciación correctas dentro B.
He intentado varias técnicas, pero ninguno parecen satisfacer todas mis necesidades.
- el uso de herramientas del módulo subproceso significa excepciones en B no se propagan a A.
execfile("B.py", {})
carreras B, pero no se piensa que es principal.execfile("B.py", {'__name__': '__main__'})
hace que B.py piense que es principal, pero también parece estropear la impresión de traceback de excepción, de modo que los tracebacks se refieren a líneas dentro de A (es decir, el__main__
real).- usando
imp.load_source
con__main__
como el nombre casi funciona, excepto que en realidad modifica sys.modules, pisando fuerte tanto en el valor actual de__main__
¿Hay alguna manera de obtener lo que quiero?
(La razón por la que hago esto es porque estoy realizando una limpieza en una biblioteca existente. Esta biblioteca no tiene un conjunto de pruebas real, solo un conjunto de scripts "de ejemplo" que producen cierto resultado. Estoy intentando aprovechar estos como pruebas para garantizar que mi limpieza no afecte la capacidad de la biblioteca de ejecutar estos ejemplos, por lo que quiero ejecutar cada script de ejemplo desde mi suite de pruebas. Me gustaría poder ver las excepciones de estos guiones dentro de el script de prueba para que el script de prueba pueda informar el tipo de falla, en lugar de solo informar un SubprocessError genérico cada vez que un script de ejemplo presente alguna excepción).
Solución interesante. Dudo (y espero ...) que alguna vez lo necesite, pero las cosas que Python permite y permite son geniales. –