El módulo de subproceso presente en Python (tanto 2.x como 3.x) se usa para ejecutar nuevas aplicaciones o programas a través del código de Python mediante la creación de nuevos procesos. También ayuda a obtener las tuberías de entrada/salida/error, así como los códigos de salida de varios comandos.
Para ejecutar diferentes programas usando Python se utilizan dos funciones del módulo de subprocesos:
1.subprocess.check_call(args, *, stdin=Ninguno, stdout=Ninguno, stderr=Ninguno, shell=False)
Parámetros:
args=El comando a ejecutar. Se pueden pasar varios comandos como una string separados por “;” .
stdin=Valor del flujo de entrada estándar que se pasará como (os.pipe()).
stdout=Valor de la salida obtenida del flujo de salida estándar.
stderr=Valor del error obtenido (si lo hay) del flujo de error estándar.
shell=parámetro booleano. Si es verdadero, los comandos se ejecutan a través de un nuevo entorno de shell.
Valor de retorno:
la función devuelve el código de retorno del comando. Si el código de retorno es cero, la función simplemente regresa (el comando se ejecutó correctamente); de lo contrario, se generará CalledProcessError.2.subprocess.check_output(args, *, stdin=Ninguno, stderr=Ninguno, shell=False, universal_newlines=False)
Parámetros:
args=El comando a ejecutar. Varios comandos se pueden pasar como una string separados por «;».
stdin=Valor del flujo de entrada estándar que se pasará como tubería (os.pipe()).
stdout=Valor de la salida obtenida del flujo de salida estándar.
stderr=Valor del error obtenido (si lo hay) del flujo de error estándar.
shell=parámetro booleano. Si es verdadero, los comandos se ejecutan a través de un nuevo entorno de shell.
universal_newlines=Parámetro booleano. Si los archivos verdaderos que contienen stdout y stderr se abren en modo de nueva línea universal.
Valor devuelto:
La función devuelve el código de retorno del comando. Si el código de retorno es cero, la función simplemente devuelve el resultado como una string de bytes (el comando se ejecutó correctamente); de lo contrario, se generará CalledProcessError.
Consideremos los siguientes ejemplos:
programa C:
#include<stdio.h> int main() { printf("Hello World from C"); // returning with any other non zero value // would result in an exception // when called from python return 0; }
programa C++:
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << "Hello World from C++.Values are:" << a << " " << b; return 0; }
Programa Java:
class HelloWorld { public static void main(String args[]) { System.out.print("Hello World from Java."); } }
Código de Python 3 para ejecutar los programas anteriores:
# Python 3 program to demonstrate subprocess # module import subprocess import os def excuteC(): # store the return code of the c program(return 0) # and display the output s = subprocess.check_call("gcc HelloWorld.c -o out1;./out1", shell = True) print(", return code", s) def executeCpp(): # create a pipe to a child process data, temp = os.pipe() # write to STDIN as a byte object(convert string # to bytes with encoding utf8) os.write(temp, bytes("5 10\n", "utf-8")); os.close(temp) # store output of the program as a byte string in s s = subprocess.check_output("g++ HelloWorld.cpp -o out2;./out2", stdin = data, shell = True) # decode s to a normal string print(s.decode("utf-8")) def executeJava(): # store the output of # the java program s = subprocess.check_output("javac HelloWorld.java;java HelloWorld", shell = True) print(s.decode("utf-8")) # Driver function if __name__=="__main__": excuteC() executeCpp() executeJava()
Producción:
Hello World from C, return code 0 Hello World from C++. Values are:5 10 Hello World from Java.
Nota: Aunque el módulo de subproceso es independiente del sistema operativo, estos comandos solo deben ejecutarse en entornos Linux. También de acuerdo con la documentación de Python, pasar shell=True puede ser un peligro para la seguridad si se combina con una entrada que no es de confianza.
Publicación traducida automáticamente
Artículo escrito por SouravAChowdhury_97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA