¿Cómo capturar la salida del terminal como ganancias de ejecución? -- mmand-line campo con bash campo con scripts campo con python campo con gnome-terminal camp askubuntu Relacionados El problema

How to capture terminal output as execution proceeds?


1
vote

problema

Español

He intentado usar todos los comandos Mencione la respuesta del comandante del byte a la pregunta aquí pero no funcionan a menos que finalice el programa.

Estoy ejecutando un script de Python como 'Python Script.py' y he intentado reemplazar 'Command' en la respuesta del comandante de Byte con 'Python Script.PY' Sin embargo, la salida del terminal ya no se muestra en el terminal con ninguno de los Los comandos y solo se escriben en el archivo de salida.txt en el caso de que se complete el script de Python (en realidad, lo he descubierto que viene en grandes trozos a medida que avanza, pero no en línea como lo requiero). Creo que puede ser porque el script de Python llama a otro programa de no-Python en otra cáscara (llama un paquete de elementos finitos llamado GMSH). El código lleva mucho tiempo (varias horas) para completar y quiero poder ver la salida escrita en el archivo a medida que avanza, por lo que puedo ver su progreso y cómo se ve la salida del terminal, incluso si el programa se bloquea a través de la parte. . ¿Cómo podría ser capaz de hacer esto?

He añadido una Video para demostrar el problema. Cuando el programa se ejecuta sin captura, la información viene línea por línea. Cuando intento capturar la salida, viene en trozos, cuando estos trozos llevan horas y se estrella durante este proceso, no obtengo información sobre dónde se estrelló.

Original en ingles

I have tried using all the commands mention in Byte Commander's answer to the question here but they do not work unless the program finishes.

I am running a python script like so 'python script.py' and have tried replacing 'command' in Byte Commander's answer with 'python script.py' however the terminal output is not shown in the terminal anymore with any of the commands and only gets written to the file output.txt in the case that the python script completes (actually I've discovered it comes in large chunks as it proceeds, but not line-by-line as I require). I believe it may be because the python script calls another non-python program in another shell (it calls a finite element package called gmesh). The code takes a long time (several hours) to complete and I want to be able to see the output written to the file as it proceeds so I can see it's progress and what the terminal output looks like even if the program crashes part way through. How might I be able to go about this?

I've added a video to demonstrate the issue. When the program runs without capture the information comes line by line. When I attempt to capture the output it comes in chunks, when these chunks takes hours and it crashes during this process I get no information on where it crashed.

              
   
   

Lista de respuestas

0
 
vote

Puede hacerlo como en el siguiente ejemplo.

Supongamos que tenemos un guión llamado myscript.py que se ve así:

  import time for x in range(0, 33):    print("hello", x, flush=True)    time.sleep(1)   

Entonces, si lo ejecutamos así:

  python3 myscript.py > mylog.txt   

Se colgará hasta que se complete, por lo que no veremos la salida mientras se está ejecutando.

Para poder ver la salida mientras se está ejecutando, podemos hacerlo en su lugar:

  python3 myscript.py > mylog.txt &   

Donde el Ampersand significa que el terminal no se colgará, podemos dar más comandos mientras se está ejecutando. Luego, podemos hacer esto para ver el contenido del archivo de registro mientras MyScript.sh le está escribiendo:

  tail -f mylog.txt   

(Otra posibilidad es abrir una ventana de terminal separada y hacer tail -f mylog.txt desde allí.)

Tenga en cuenta que para que esto funcione, el ABCDEFGHIJKLMNABCDEFGHIJKLMN6 Parte del ABCDEFGHIJKLMNABCDEFGHIJKLMN7 La línea es importante, sin flush=True se verá el contenido del archivo. después de que finalice el programa.

En caso de que la salida se genere de algún otro programa dentro de su script de Python, puede intentar agregar import sys y luego hacer import time for x in range(0, 33): print("hello", x, flush=True) time.sleep(1) 0 en el código de Python después de llamar al otro programa . Consulte https://stackoverflow.com/a/230774/6708867

 

You can do as in the following example.

Suppose we have a script called myscript.py that looks like this:

import time for x in range(0, 33):    print("hello", x, flush=True)    time.sleep(1) 

Then if we run it like this:

python3 myscript.py > mylog.txt 

it will hang there until it completes, so we will not see the output while it is running.

To be able to see the output while it is running, we can do this instead:

python3 myscript.py > mylog.txt & 

where the ampersand means that the terminal will not hang, we can give more commands while it is running. Then, we can do this to look at the contents of the log file while myscript.sh is writing to it:

tail -f mylog.txt 

(Another possibility is to open a separate terminal window and do tail -f mylog.txt from there.)

Note that for this to work, the flush=True part of the print line is important, without flush=True the file contents will only be seen after the program completes.

In case the output is generated from some other program inside your python script, you can try adding import sys and then doing sys.stdout.flush() in the python code after calling the other program. See https://stackoverflow.com/a/230774/6708867

 
 
         
         
0
 
vote
  import time for x in range(0, 33):    print("hello", x, flush=True)    time.sleep(1) 1  

Crear 2 archivos de texto vacíos llamados OutputLog y ERRORLOG en el directorio de trabajo.

Use Shlex para construir su comando, POPEN para IPC.

 
import subprocess,shlex command = 'python mesh.py' workingdirectory = 'C:users/Account/Desktop' try:     process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE,                                      stderr=subprocess.PIPE, shell=True, cwd=workingdirectory)      stdout, stderr = process.communicate()       if stderr.decode('utf-8') == "":         with open(outputlog.txt, 'w'):              file.write(stdout.decode('utf-8'))      else:           with open(errorlog.txt,'w') as file:               file.write(stderr.decode('utf-8')) 

Create 2 empty text files named outputlog and errorlog in the working directory.

Use Shlex to build your command, Popen for IPC.

 
 
0
 
vote

si desea obtener la salida como una cadena. Trate de seguir esto:

ABCDEFGHIJKLMNABCDEFGHIJKLMN12

El módulo abre una tubería hacia o desde un comando; Entonces puedes registrarlo como cualquier otro contenido.

 

If you want to get the output as a string. Try to follow this:

Var = os.popen(command).read()

The module opens a pipe to or from a command; then you can log it like any other content.

 
 

Relacionados problema

63  Cambiar el ancho predeterminado de Gnome-Terminal y Terminator Windows  ( Change default width of gnome terminal and terminator windows ) 
Solo una pregunta corta, pero es posible establecer el ancho predeterminado (y la altura) de las sesiones terminales en gnome-terminal y terminator ? Enc...

0  Ubuntu 12.04 Desktop sin iniciador y sin tibias que trabajan [duplicar]  ( Ubuntu 12 04 desktop with no launcher and no shortkeys working ) 
Esta pregunta ya tiene respuestas aquí : ¿Por qué no puedo registrar ¿Después de una persona que no ...

2  Asignar Geany o GEDIT resaltado al texto  ( Assign geany or gedit highlight to text ) 
¿Hay alguna forma de asignar el punto culminante de Geany al texto? Por ejemplo, cuando paso un código de programación a Geany. Funciones El color es rojo. Lo...

4  Alt-Key dejó de funcionar en Gnome-Terminal después de la actualización a Ubuntu 19.04  ( Alt key stopped working in gnome terminal after upgrade to ubuntu 19 04 ) 
Por ejemplo, no puedo cambiar entre las pestañas en el terminal GNOME con ALT + 1, ALT + 2. Los accesos directos en general y los accesos directos del menú es...

0  La propiedad "use el tamaño de terminal predeterminado de uso personalizado" de la terminal no funciona  ( Terminals use custom default terminal size property does not work ) 
Estoy tratando de hacer una propiedad personalizada para el tamaño del terminal. Mis cambios no tienen efecto y el terminal todavía comienza en modo de pantal...

2  GNOME-Terminal "No se puede abrir ubicación" error [cerrado]  ( Gnome terminal cannot open location error ) 
Es poco probable que esta pregunta ayude a cualquier visitante futuro; Solo es relevante para un pequeño área geográfica, u...

0  Unity Dash, así como el terminal no viene  ( Unity dash as well as terminal is not coming ) 
Estaba navegando a través de ls: cannot access 'resolv.conf.d': Stale file handle ls: cannot access 'update-libc.d': Stale file handle ls: cannot access 'upd...

1  Programa que no se ejecuta correctamente cuando se ejecuta en el terminal  ( Program not running properly when run in terminal ) 
Estoy ejecutando programas C ++ usando el emulador de terminal de GNOME en Ubuntu 10.04. El programa tiene una serie de pasos y obtengo el programa para impri...

2  Instalación de Python3.6 (y purgando unos 3.5 paquetes) desordenado con mi terminal  ( Installing python3 6 and purging some 3 5 packages messed up with my terminal ) 
Estuve siguiendo las instrucciones para instalar Python3.6 en mi máquina Ubuntu 16.04 de aquí y en el proceso también hice un sudo apt-get purge en alguno...

18  ¿Qué hace el '|' (barra vertical) Carácter significa en un comando terminal? [duplicar]  ( What does the vertical bar character mean in a terminal command ) 
Esta pregunta ya tiene respuestas aquí : ¿Cuál es la diferencia entre "Redirección" y "tubería"? ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos