El programa de Python no se detiene una vez que se construye -- python campo con ubuntu campo con subprocess camp Relacionados El problema

python program doesnt stop once its built


0
vote

problema

Español

Comience este programa all.py

  import subprocess import os  scripts_to_run = ['AppFlatForRent.py','AppForSale.py','CommercialForSale.py','LandForSale.py','MultipleUnitsForSale.py','RentalWanted.py','RentCommercial.py','RoomsForRent.py','RoomsWanted.py','ShortTermDaily.py','ShortTermMonthly.py','VillaHouseForRent.py','VillaHouseForSale.py']   for s in scripts_to_run:     subprocess.Popen(["python", os.path.join(os.getcwd(), s)])   

su carrera 13 programas a la vez. El problema es que, en el sublime, a diferencia de otros programas, este programa en particular no cancela el fabricado. Simplemente sigue funcionando (lo sé porque el programa está ingresando valores en la base de datos y no deja de hacerlo)

Quiero que se haga a través de la terminal.

¿Alguna ayuda?

Original en ingles

I start this program all.py

import subprocess import os  scripts_to_run = ['AppFlatForRent.py','AppForSale.py','CommercialForSale.py','LandForSale.py','MultipleUnitsForSale.py','RentalWanted.py','RentCommercial.py','RoomsForRent.py','RoomsWanted.py','ShortTermDaily.py','ShortTermMonthly.py','VillaHouseForRent.py','VillaHouseForSale.py']   for s in scripts_to_run:     subprocess.Popen(["python", os.path.join(os.getcwd(), s)]) 

Its running 13 programs at a time. The problem is that in the sublime - unlike other programs- this particular program doesnt cancel the built. it just keep running (I know because the program is inputting values in the database and it doesnt stop doing that)

I want it to be done via terminal.

any help?

        
         
         

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Hay dos enfoques que puedes tomar.

El enfoque de la cáscara

Si solo desea matar los procesos secundarios después de que la aplicación principal haya terminado, pero no quiere que la aplicación principal se encargue de esto, por cualquier motivo (en su mayoría su para fines de depuración), puede hacerlo desde el terminal:

     kill $(ps aux |grep -E 'python[[:space:]][[:alnum:]]+.py' |awk '{print $2}')                ▲     ▲                                      ▲            ▲                ║     ╚═══════════════════╦══════════════════╝            ║   Get all ═════╝                         ║                               ║   running                                ║                Get the second column   processes                  Find all scripts executed         which is the PID                             by Python, ending with .py                         (check Note 1 for more details)   

Note 1 : La expresión regular en el ejemplo superior es solo para fines de demostración y solo mata los scripts ejecutados con una ruta relativa como python script.py , pero no incluye procesos Como python /path/to/script.py . Esto es solo un ejemplo, así que asegúrese de adaptar la expresión regular a sus necesidades específicas.
Note 2 : Este enfoque es arriesgado porque puede matar aplicaciones no deseadas, asegúrese de saber qué está haciendo antes de usarlo.

El enfoque de Python

El otro enfoque ofrece más control, y se implementa en la propia aplicación principal. Puede asegurarse de que todos los procesos infantiles se salgan cuando finalice la aplicación principal haciendo un seguimiento de todos los procesos que creó, y matándolos después.

Ejemplo de uso:
Primero cambie su código de desove de su proceso para mantener el Popen Objetos de los procesos de ejecución para uso posterior:

  running_procs = [] for s in scripts_to_run:     running_procs.append(                   subprocess.Popen(["python", os.path.join(os.getcwd(), s)])                         )   

Luego, defina la función def do_clean(): for p in running_procs: p.kill() 5 que le itará a través de ellos y terminará:

  def do_clean():     for p in running_procs:         p.kill()   

Puede llamar a esta función manualmente siempre que desee hacer esto, o puede usar el > Atexit Módulo para hacer esto cuando la aplicación está terminando.

El módulo ATEXIT define una sola función para registrar la limpieza funciones Funciones así registradas se ejecutan automáticamente en Terminación normal del intérprete.

nota : las funciones registradas a través de este módulo no se llaman cuando el El programa es asesinado por una señal no manejada por Python, cuando un pitón Se detecta un error interno fatal, o cuando se llama OS._exit ().

Por ejemplo:

  import atexit  atexit.register(do_clean)   
 

There are two approaches you can take.

The shell approach

If you only want to kill the child processes after the main app has finished but don't want the main app to handle this itself, for any reason (mostly its for debugging purposes), you can do it from the terminal:

   kill $(ps aux |grep -E 'python[[:space:]][[:alnum:]]+.py' |awk '{print $2}')                xe2x96xb2     xe2x96xb2                                      xe2x96xb2            xe2x96xb2                xe2x95x91     xe2x95x9axe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95xa6xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x9d            xe2x95x91   Get all xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x90xe2x95x9d                         xe2x95x91                               xe2x95x91   running                                xe2x95x91                Get the second column   processes                  Find all scripts executed         which is the PID                             by Python, ending with .py                         (check Note 1 for more details) 

Note 1: the regular expression in the upper example is just for demonstration purposes and it kills only scripts executed with a relative path like python script.py, but does not include processes like python /path/to/script.py. This is just an example, so make sure to adapt the regular expression to your specific needs.
Note 2: this approach is risky because it can kill unwanted applications, make sure you know what you are doing before using it.

The Python approach

The other approach offers more control, and is implemented in the main application itself. You can make sure that all child processes are exited when the main application ends by keeping track of all the processes you created, and killing them afterwards.

Example usage:
First change your process spawning code to keep the Popen objects of the running processes for later usage:

running_procs = [] for s in scripts_to_run:     running_procs.append(                   subprocess.Popen(["python", os.path.join(os.getcwd(), s)])                         ) 

Then define the do_clean() function that will iterate through them and terminate them:

def do_clean():     for p in running_procs:         p.kill() 

You can call this function manually whenever you wish to do this, or you can use the atexit module to do this when the application is terminating.

The atexit module defines a single function to register cleanup functions. Functions thus registered are automatically executed upon normal interpreter termination.

Note: The functions registered via this module are not called when the program is killed by a signal not handled by Python, when a Python fatal internal error is detected, or when os._exit() is called.

For example:

import atexit  atexit.register(do_clean) 
 
 
         
         
0
 
vote

Para detener todo el script infantil, podría llamar .terminate() , .kill() MÉTODOS:

  python script.py0  
 

To stop all child script, you could call .terminate(), .kill() methods:

import sys import time from subprocess import Popen  # start child processes children = [Popen([sys.executable or 'python', scriptname])             for scriptname in scripts_to_run]  time.sleep(30) # wait 30 seconds  for p in children:     p.terminate() # or p.kill()  for p in children:     p.wait() # wait until they exit 
 
 
 
 

Relacionados problema

2  Salida de impresión en tiempo real desde el subproceso  ( Printing output in realtime from subprocess ) 
Estoy tratando de imprimir STOUT en tiempo real para un subproceso, pero parece que STDOUT está tamponado incluso con Bufsize = 0 y no puedo averiguar cómo ha...

1  No puedo leer y escribir desde la cáscara de ADB  ( Cant read and write from adb shell ) 
Estoy tratando de controlar un terminal con Python. Según la documentación que he encontrado, debería poder usar POPEN para ejecutar comandos de terminales, c...

0  Usando subproceso en Python, obtengo resultados diferentes cuando en Python Cmd y Python inact  ( Using subprocess in python i get different results when in python cmd and pytho ) 
Espero que el título tenga sentido. Para dar detalles: Estoy usando csvtotable ( https://github.com/vividvilla/csvotable ) para generar Tablas HTML de CSV. ...

35  Utilizando subprocesos.popen para el proceso con una gran salida  ( Using subprocess popen for process with large output ) 
Tengo un código de pitón que ejecuta una aplicación externa que funciona bien cuando la aplicación tiene una pequeña cantidad de salida, pero cuelga cuando ha...

1  Python 3 ejecuta dos aplecturas en Windows Parallel  ( Python 3 run two applcations in windows parallel ) 
Una pregunta: quiero ejecutar dos archivos EXE diferentes paralelos (Windows). Todas mis pruebas comienzan las dos aplicaciones, pero una después de la otra (...

0  ¿Es STdout = subprocesos.Pipe para un subproceso que probablemente cause algún punto muerto?  ( Is stdout subprocess pipe for a subprocess likely to cause any deadlock ) 
Digamos que tenemos un subproceso como lo siguiente y queremos tener control sobre su verbosidad, es decir, tener sus errores o salidas impresas en nuestro te...

23  Compruebe el código de retorno de un comando cuando subprocess aumenta una excepción llamadaProcessError  ( Check a commands return code when subprocess raises a calledprocesserror except ) 
Quiero capturar la secuencia stdout de un comando Shell en un script Python (3), y poder, al mismo tiempo, para verificar el código de retorno del comando S...

528  Una lectura no bloqueada en un subproceso. Pipe en Python  ( A non blocking read on a subprocess pipe in python ) 
Estoy usando el Módulo de subproceso para iniciar un subproceso y conectarse a su salida corriente (salida estándar). Quiero poder ejecutar lecturas de no b...

47  ¿Cómo obtengo información "en tiempo real" de un subproceso.Popen en Python (2.5)  ( How do i get real time information back from a subprocess popen in python 2 5 ) 
Me gustaría usar el módulo de subproceso de la siguiente manera: Crea un nuevo proceso que lo lleva mucho tiempo para ejecutar. Capture stdout (o stde...

8  Añadir un proceso a una lista (pero no hacer nada con él) altera el comportamiento del programa  ( Appending a process to a list but doing nothing with it alters program behavio ) 
En el siguiente programa, cuando agrego el proceso a una lista (una cosa aparentemente sin sentido), se ejecuta como se espera. Pero si quito la Anexa, los pr...




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