<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://es.wikieducator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://es.wikieducator.org/index.php?action=history&amp;feed=atom&amp;title=Curso_Python_DGA_2011%2Fsistemas%2Fprocesos</id>
		<title>Curso Python DGA 2011/sistemas/procesos - Historial de revisiones</title>
		<link rel="self" type="application/atom+xml" href="https://es.wikieducator.org/index.php?action=history&amp;feed=atom&amp;title=Curso_Python_DGA_2011%2Fsistemas%2Fprocesos"/>
		<link rel="alternate" type="text/html" href="https://es.wikieducator.org/index.php?title=Curso_Python_DGA_2011/sistemas/procesos&amp;action=history"/>
		<updated>2026-06-19T03:56:00Z</updated>
		<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
		<generator>MediaWiki 1.23.14</generator>

	<entry>
		<id>https://es.wikieducator.org/index.php?title=Curso_Python_DGA_2011/sistemas/procesos&amp;diff=5334&amp;oldid=prev</id>
		<title>Luis.perez: Página creada con '== Procesos en Python ==  En esta sección veremos cómo usar el módulo '''subprocess''' para poder lanzar procesos desde python, y conectar con sus entradas y salidas estánda…'</title>
		<link rel="alternate" type="text/html" href="https://es.wikieducator.org/index.php?title=Curso_Python_DGA_2011/sistemas/procesos&amp;diff=5334&amp;oldid=prev"/>
				<updated>2011-08-30T06:36:51Z</updated>
		
		<summary type="html">&lt;p&gt;Página creada con &amp;#039;== Procesos en Python ==  En esta sección veremos cómo usar el módulo &amp;#039;&amp;#039;&amp;#039;subprocess&amp;#039;&amp;#039;&amp;#039; para poder lanzar procesos desde python, y conectar con sus entradas y salidas estánda…&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Procesos en Python ==&lt;br /&gt;
&lt;br /&gt;
En esta sección veremos cómo usar el módulo '''subprocess''' para poder lanzar procesos desde python, y conectar con sus entradas y salidas estándar y de error, así como obtener sus valores de retorno.&lt;br /&gt;
&lt;br /&gt;
Unifica los módulos y funciones existentes para el control de procesos. Ventajas y motivaciones del módulo:&lt;br /&gt;
* Reemplazar y unificar los variados módulos y funciones existentes, tales como os.system, os.spawn*, os.popen*, popen2.*, y commands.*. &lt;br /&gt;
* Excepciones inter-proceso: Si se produce una excepción en el proceso hijo antes de ejecutar el comando, esta excepción se relanza al proceso padre. Ej: OSError cuando se intenta ejecutar un fichero que no existe&lt;br /&gt;
* Posibilidad de ejecutar un hook entre fork() y exec()&lt;br /&gt;
* No se llama implícitamente a la shell&lt;br /&gt;
* Único interfaz para todas las posibles combinaciones de redirección de stdin, stdout, y stderr (en lugar de tener que usar multiples funciones, como popen2, popen3, etc&lt;br /&gt;
* Soporte para conectar varios subprocesos (shell pipe)&lt;br /&gt;
* Método ''comunicate'' para facilitar el envío de datos por el stdin y leer de stdout y stderr con seguridad de no caer en deadlocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subprocess define la clase ''''Popen'''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
subprocess.Popen(args, bufsize=0, executable=None, &lt;br /&gt;
                 stdin=None, stdout=None, stderr=None, preexec_fn=None, &lt;br /&gt;
                 close_fds=False, shell=False, cwd=None, env=None, &lt;br /&gt;
                 universal_newlines=False, startupinfo=None, creationflags=0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Argumentos y ejecución en shell o fuera de ella ====&lt;br /&gt;
* ''args '' debe ser una string describiendo el comando a ejecutar, o una lista de cadenas empezando por el comando y seguido por los parámetros a ejecutar, segun el caso:&lt;br /&gt;
&lt;br /&gt;
* En unix:&lt;br /&gt;
** Si ''''shell=False'''' (por defecto), ''args'' ha de ser una lista. Si se pasa una string, ha de ser únicamente el path al comando a ejecutar&lt;br /&gt;
** Si ''''shell=True'''', ''args'' ha de ser una cadena que será pasada tal cual a una shell.&lt;br /&gt;
&lt;br /&gt;
{{Ejemplo|Title=Comparando ejecución en shell y fuera de ella|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; subprocess.Popen(&amp;quot;ls -la .vim*&amp;quot;, shell=True)&lt;br /&gt;
-rw------- 1 luis luis 26240 2011-08-29 09:18 .viminfo&lt;br /&gt;
-rw-r--r-- 1 luis luis   655 2011-08-05 08:37 .vimrc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; subprocess.Popen(&amp;quot;ls -la .vim*&amp;quot;)&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
  File &amp;quot;/usr/lib/python2.7/subprocess.py&amp;quot;, line 672, in __init__&lt;br /&gt;
    errread, errwrite)&lt;br /&gt;
  File &amp;quot;/usr/lib/python2.7/subprocess.py&amp;quot;, line 1213, in _execute_child&lt;br /&gt;
    raise child_exception&lt;br /&gt;
OSError: [Errno 2] No such file or directory&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fuera de la shell no se hacen sustituciones!:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; subprocess.Popen([&amp;quot;ls&amp;quot;,&amp;quot;-la&amp;quot;,&amp;quot;.vim*&amp;quot;])&lt;br /&gt;
&amp;lt;subprocess.Popen object at 0x2269c50&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ls: cannot access .vim*: No such file or directory&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ok:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; subprocess.Popen([&amp;quot;ls&amp;quot;,&amp;quot;-la&amp;quot;,&amp;quot;.vimrc&amp;quot;])&lt;br /&gt;
-rw-r--r-- 1 luis luis 655 2011-08-05 08:37 .vimrc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* '''Atención:''' Siempre que la ejecución de un comando vaya a hacerse como resultado de un input por parte de un usuario, ha de evitarse la ejecución en shell, puesto que es vulnerable a inyección de comandos.&lt;br /&gt;
&lt;br /&gt;
==== Parámetros stdin, stdout y stderr ====&lt;br /&gt;
Sirven para poder redireccionar las entradas y salidas estandar y de error del nuevo proceso.&lt;br /&gt;
* Estos parámetros admiten:&lt;br /&gt;
** Un descriptor de archivo (entero positivo)&lt;br /&gt;
** Un objeto de tipo file&lt;br /&gt;
** subprocess.PIPE: Si se especifica esto, una nueva tubería o &amp;quot;pipe&amp;quot; será creada para conectar con el nuevo proceso.&lt;br /&gt;
** None: No habrá ningún tipo de redirección&lt;br /&gt;
&lt;br /&gt;
{{Ejemplo|Title=Encadenando procesos con pipes|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p1 = Popen([&amp;quot;ps&amp;quot;, &amp;quot;fax&amp;quot;], stdout=PIPE)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p2 = Popen([&amp;quot;grep&amp;quot;, &amp;quot;python&amp;quot;], stdin=p1.stdout)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p1.stdout.close()  # Permitir que p1 reciba SIGPIPE si p2 acaba antes que p1&lt;br /&gt;
 4791 pts/3    S+     0:00              |           |   \_ python&lt;br /&gt;
 1869 ?        S      0:04              \_ /usr/bin/python /usr/share/system-con&lt;br /&gt;
 1558 ?        Sl     0:00 /usr/bin/python /usr/bin/zeitgeist-daemon&lt;br /&gt;
 1887 ?        Sl     0:48 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-s&lt;br /&gt;
 2053 ?        S      0:00 /usr/bin/python /usr/lib/system-service/system-servic&lt;br /&gt;
 2057 ?        SNl    0:06 /usr/bin/python2.7 /usr/bin/update-manager --no-focus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Si se usa PIPE, los objetos tipo file que podemos usar para escribir se encuentran en  ''Popen.stdin'',''Popen.stdout'', y Popen.stderr''.&lt;br /&gt;
'''Atención:''' Para evitar deadlocks provocados por el bloqueo del proceso hijo por llenado de los buffers de las pipes, usar la función ''communicate()'' en lugar de las pipes directamente.&lt;br /&gt;
&lt;br /&gt;
==== Otros parámetros ====&lt;br /&gt;
* ''bufsize'': Si se pasa, mismo significado que la función built-in open() de python: 0 - no se usa buffer. 1 - buffer por línea, y cualquier otro número positivo significa que se usará un buffer de ese tamaño. Un número negativo indica que se usará el valor por defecto del sistema operativo.&lt;br /&gt;
* ''preexec_fn'': Función que se ejecutará cuando se cree el proceso hijo, antes de la ejecución del programa o comando pasado (Solo en unix).&lt;br /&gt;
* ''cwd'': Path al que se cambiará el directorio actual de trabajo antes de ejecutar el proceso.&lt;br /&gt;
* ''env'': Map para sobreescribir las variables de entorno del sistema.&lt;br /&gt;
&lt;br /&gt;
==== Obteniendo el código de retorno y el pid del proceso ====&lt;br /&gt;
&lt;br /&gt;
* El código de retorno se obtiene a través de ''Popen.returncode''&lt;br /&gt;
* El pid del nuevo proceso creado a través de ''Popen.pid''&lt;br /&gt;
&lt;br /&gt;
==== Otras funciones de '''subprocess''' para simplificar el uso ====&lt;br /&gt;
* '''subprocess.call(*popenargs, **kwargs)''': Ejecuta el comando especificado en ''popenargs'' (mismo uso que en Popen), espera a la finalización del comando y devuelve el código de error. Se pueden pasar los mismos parámetros con nombre que en Popen.&lt;br /&gt;
* '''subprocess.check_call(*popenargs, **kwargs)''': Igual que la anterior, pero lana una ''CalledProcessError'' si el valor de retorno es menor que 0. El objeto CalledProcessError contiene el código de retorno en el atributo returncode.&lt;br /&gt;
* '''subprocess.check_output(*popenargs, **kwargs)''': Igual que la anterior, pero devuelve la salida como una cadena.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; subprocess.check_output([&amp;quot;ls&amp;quot;, &amp;quot;-l&amp;quot;, &amp;quot;.vimrc&amp;quot;])&lt;br /&gt;
'-rw-r--r-- 1 luis luis 655 2011-08-05 08:37 .vimrc\n'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esperando a que acaben los procesos y comprobando estado ====&lt;br /&gt;
&lt;br /&gt;
* El método ''wait()'' de Popen bloquea hasta que el proceso acaba.&lt;br /&gt;
* El método ''poll()''' de Popen devuelve el código de retorno si el proceso ha acabado, o None si está en curso.&lt;br /&gt;
&lt;br /&gt;
==== Terminando procesos ====&lt;br /&gt;
&lt;br /&gt;
* El método ''terminate()'' de Popen envía SIGTERM al proceso hijo en Unix. En Windows, ejecuta TerminateProcess() del api de win32.&lt;br /&gt;
* El método ''kill()'' de Popen envíoa SIGKILL al proceso hijo en Unix. En Windows es un alias para terminate().&lt;br /&gt;
&lt;br /&gt;
{{Ejemplo|Title=Matando un proceso|&lt;br /&gt;
Usando el método kill de Popen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p = Popen([&amp;quot;sleep&amp;quot;, &amp;quot;1000&amp;quot;])&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p.kill()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p.poll()&lt;br /&gt;
-9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usando '''os.kill''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p = Popen([&amp;quot;sleep&amp;quot;, &amp;quot;1000&amp;quot;])&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p.pid&lt;br /&gt;
5162&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p.poll()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; os.kill(5162, 9)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; p.poll()&lt;br /&gt;
-9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Enviando señales a procesos ====&lt;br /&gt;
&lt;br /&gt;
* Se pueden enviar señales a un proceso usando el método ''send_signal(signal)''.&lt;br /&gt;
* También se puede usar el método ''kill(pid, signal)'' del módulo ''''os''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Deadlocks y el método ''communicate'' ====&lt;br /&gt;
&lt;br /&gt;
El uso de stdin y stdout/stderr mediante pipes en los procesos puede causar deadlocks si el proceso hijo genera suficientes datos en la pipe de salida tal que se bloquea esperando que el buffer acepte más datos. Para evitarlo, puede usarse ''Popen.communicate(input=None)''&lt;br /&gt;
&lt;br /&gt;
* Interacciona con el proceso, envía datos al stdin y lee del stdout y stderr&lt;br /&gt;
* Espera a que acabe el proceso&lt;br /&gt;
* Se le puede enviar datos al proceso usando el parámetro input como una string&lt;br /&gt;
* Devuelve una tupla (stdoutdata, stderrdata)&lt;br /&gt;
* Si se quiere poder enviar al stdin y recibir del stdout y stderr, se ha de pasar PIPE al crear los objetos Popen.&lt;/div&gt;</summary>
		<author><name>Luis.perez</name></author>	</entry>

	</feed>