Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo utilizar el shell de Python

Cómo utilizar el shell de Python

Hay muchas formas de ejecutar comandos de Shell en Python. Hay discusiones que comparan estos métodos en stackoverflow. Llamar a un comando externo en Python indica que usar el módulo de subproceso es mejor. Por lo tanto, este artículo explica cómo utilizar el módulo de subproceso para implementar la funcionalidad de un script de shell.

El módulo subprocess proporciona una variedad de métodos para ejecutar comandos de Linux, como el método subprocess.call(), el método subprocess.check_call(), etc. Todos estos métodos son encapsulaciones de la clase Popen, por lo que este artículo se centra en el uso de la clase Popen.

Ejecución de comandos de Shell

Puedes crear un objeto Popen pasando el comando a ejecutar a Popen(), de modo que se creará un proceso hijo para ejecutar el comando. Por ejemplo:

niño = subproceso.Popen(["ping", "-c", "5", "leehao.me"])

1

El código anterior creará un proceso hijo para ejecutar el comando ping -c 5 leehao.me. Este comando se pasa al método Popen() en forma de lista. Si queremos usar directamente la forma de cadena de ping -c 5 leehao.me, podemos agregar shell=True para lograr esto:

child = subprocess.Popen("ping -c 5 leehao.me" , shell=True )

1

El documento oficial indica que no se recomienda utilizar shell=True por razones de seguridad. Para obtener instrucciones detalladas, consulte la descripción del. documento oficial.

Esperando a que se ejecute el proceso hijo

Después de que el proceso hijo ejecuta el comando, el proceso principal no esperará a que se ejecute el proceso hijo. Para que el proceso principal espere a que finalice la ejecución del proceso secundario, es necesario llamar explícitamente al método Popen.wait(). Por ejemplo:

niño = subproceso.Popen(["ping", "-c", "5", "leehao.me"])

niño.wait()< / p>

imprimir 'terminado padre'

1

2

3

De esta manera, el proceso principal espere a que se ejecute el proceso hijo. Una vez completado el comando ping, se imprimirá el resultado del final del padre.

Obtener resultados de ejecución

Para obtener la salida del subproceso Popen(), puede utilizar el método Popen.communicate(), por ejemplo:

def subprocess_cmd(comando) :

proceso = subproceso.Popen(comando, stdout=subprocess.PIPE, shell=True)

proc_stdout = proceso.comunicar()[0]. strip()

print proc_stdout

subprocess_cmd('echo leehao.me; echo www.leehao.me')

1

2

3

4

5

6

Salida:

leehao .me

www.leehao.me

El método Process.communicate() puede realizar la comunicación entre el proceso principal y el proceso secundario. El proceso principal puede enviar datos al proceso secundario a través de él y también puede leer los datos generados por el proceso secundario. En el ejemplo anterior, especificamos stdout=subprocess.PIPE al crear el objeto Popen, para que el proceso principal pueda leer la salida del subproceso.

El método comunicar() devuelve una tupla: (stdoutdata, stderrdata), Process.communicate()[0] obtiene la salida estándar del proceso hijo.

Cabe señalar que después de llamar al método comunicar(), el proceso principal también esperará a que el proceso hijo complete la ejecución.

En el ejemplo anterior, el subproceso imprime dos cadenas en la salida estándar, y el proceso principal recibe estas salidas y las imprime.