¿Cómo puedo verificar el resultado del comando en ejecución?

Dentro de un intérprete de Python personalizado, si ejecuto un solo comando, puedo ver la salida del comando.
Pero si pongo comandos en un archivo y ejecuto con execfile (‘file.py’), excepto el comando de impresión, no puedo ver nada. Es difícil de depurar.
¿Cómo puedo verificar la salida del comando cuando se ejecuta con el comando execfile?

Intentado debajo de los comandos para confirmar la versión de python.

import sys print sys.version_info[0],sys.version_info[1] 2 7 

‘comando de salida’ no es realmente un término válido. El intérprete interactivo de Python se hará eco del resultado de cualquier statement de expresión , a menos que esa expresión no produzca None . Una statement de expresión es una statement de nivel superior en el cuerpo de un módulo que solo contiene una expresión única (a diferencia de otras declaraciones simples como asignación o import o declaraciones compuestas como if o while .

En el modo interactivo, si el valor no es None , se convierte en una cadena utilizando la función repr() incorporada y la cadena resultante se escribe en la salida estándar en una línea por sí misma. (Las declaraciones de expresión que producen None no se escriben, por lo que las llamadas a procedimientos no causan ningún resultado)

No sería práctico hacerlo en un guión ; nunca sería capaz de ejecutar una statement de expresión sin que el usuario del script tenga que descifrar cada cosa impresa en la pantalla. Los scripts generalmente quieren controlar lo que se imprime (hasta el punto de no imprimir nada, sino usar el registro, por ejemplo).

Si está utilizando execfile() para ejecutar scripts, puede cambiar a analizar el script en un árbol de syntax abstracta , en cuyo punto puede transformar los nodos de las expresiones de expresión para agregar impresión. El AST transformado resultante puede alimentarse directamente a la función compile() , y la función exec() puede tomar la salida del paso de comstackción.

Usaría una función global adicional pasada a exec() aquí:

 import ast class ExprStatementPrinter(ast.NodeTransformer): def visit_Expr(self, node): # expression statement node # call the function __print_expr_result__, passing in the expression # contents; replace the original expression contents with that call. new_value = ast.Call( ast.Name('__print_expr_result__', ast.Load()), # load as a global [node.value], [], None, None) # node.value is the only argument # to be able to execute, we need to set the lineno and coll_offset; just # reuse the values of the expr node, then fix up any children node.value = ast.copy_location(new_value, node.value) return ast.fix_missing_locations(node) def print_expr_result(result): if result is not None: print repr(result) def execfile(filename): with open(filename) as source: tree = ast.parse(source.read()) ExprStatementPrinter().visit(tree) # updates the tree in-place codeobj = compile(tree, filename, 'exec') exec(codeobj, {'__print_expr_result__': print_expr_result}) 

Utilicé un nombre definido por ‘sistema’ de doble guión bajo para la función de impresión para evitar colisiones con cualquier cosa que el script pudiera haber definido.

Manifestación:

 >>> example = '''\ ... import sys ... sys.version_info[0],sys.version_info[1] ... 'Hello world!' ... None # should not be printed ... ''' >>> exec(example) # no output >>> tree = ast.parse(example) >>> ExprStatementPrinter().visit(tree) <_ast.Module object at 0x1024c14d0> >>> codeobj = compile(tree, '', 'exec') >>> exec(codeobj, {'__print_expr_result__': print_expr_result}) (2, 7) 'Hello world!' 

Nota: esto solo se aplica al archivo de nivel superior que ejecute. Todos los módulos importados todavía se ejecutarán sin transformación (como lo harían en el intérprete interactivo de Python). Tendría que conectarse al __import__ global para interceptar la maquinaria de importación normal.