{"id":70,"date":"2020-06-01T16:51:17","date_gmt":"2020-06-01T16:51:17","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=70"},"modified":"2020-06-01T16:51:19","modified_gmt":"2020-06-01T16:51:19","slug":"subprocess-popen","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=70","title":{"rendered":"subprocess.Popen"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)<\/h3>\n\n\n\n<p>Este m\u00e9todo ejecuta un programa hijo en un nuevo proceso.<\/p>\n\n\n\n<p>Son varios los argumentos que recibe, entre ellos:<\/p>\n\n\n\n<p><strong>args<\/strong> es un string o tupla con la secuencia de programa y argumentos.<\/p>\n\n\n\n<p><strong>bufsize<\/strong> es el argumento pasado para el buffering de la funci\u00f3n open() cuando se crean los ficheros objeto con los pipes de stdin\/stdout\/stderr.<\/p>\n\n\n\n<p><strong>executable<\/strong> es un programa de reemplazo a ejecutar.<\/p>\n\n\n\n<p><strong>stdin, stdout y stderr<\/strong> son los ficheros que manejan la entrada, salida y error est\u00e1ndar.<\/p>\n\n\n\n<p><strong>preexec_fn<\/strong> (solo POSIX) es un objeto a ser llamado en el proceso hijo justo antes de que sea ejecutado.<\/p>\n\n\n\n<p><strong>close_fds<\/strong> controla el cierre o la herencia de los descriptores de archivos.<\/p>\n\n\n\n<p><strong>shell<\/strong> si es True el comando ser\u00e1 ejecutado a trav\u00e9s del shell.<\/p>\n\n\n\n<p><strong>cwd<\/strong> establece el directorio actual antes de que se ejecute el proceso hijo.<\/p>\n\n\n\n<p><strong>env<\/strong> define las variables para el nuevo proceso.<\/p>\n\n\n\n<p><strong>text<\/strong> si es True hace el decode de stdin, stdout y stderr usando el encoding establecido o el del sistema en caso de no estar establecido.<\/p>\n\n\n\n<p>Y los m\u00e9todos son:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">comun\u00edcate(self, input=None, timeout=None)<\/h4>\n\n\n\n<p>Interactua con el proceso enviando datos a stdin y cerr\u00e1ndolo. Lee datos de stdout y stderr hasta que se alcance el fin de fichero. Espera que el proceso termine.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">kill(self)<\/h4>\n\n\n\n<p>Mata el proceso con SIGKILL, es decir con un apagado forzoso del proceso.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">poll(self)<\/h4>\n\n\n\n<p>Revisa si el proceso hijo ha terminado. Establece y devuelve el atributo returncode.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">send_signal(self, sig)<\/h4>\n\n\n\n<p>Env\u00eda una se\u00f1al al proceso.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">terminate(self)<\/h4>\n\n\n\n<p>Termina el proceso con SIGTERM, es decir enviando una se\u00f1al al proceso para que se cierren conexiones, ficheros, etc.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">wait(self, timeout=None)<\/h4>\n\n\n\n<p>Espera a que finalice el proceso hijo devolviendo su self.returncode.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ejemplos<\/h4>\n\n\n\n<p>En el siguiente ejemplo se ejecuta un proceso, <strong>find \/ .<\/strong>, que muestra el nombre de todas las carpetas y archivos del disco. Un bucle muestra en la pantalla el contenido de las l\u00edneas de <strong>stdout<\/strong> mientras que el resultado devuelto por el m\u00e9todo <strong>poll<\/strong> sea <strong>None<\/strong>. Cuando termine el proceso el resultado ser\u00e1 el <strong>returncode<\/strong> y el bucle finalizar\u00e1. Con esto se consigue mostrar en tiempo real la salida est\u00e1ndar que se produce mientras se ejecuta el proceso hijo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import subprocess\np = subprocess.Popen(('find','\/','.'), stdout = subprocess.PIPE)\nwhile p.poll() is None:\n    print(p.stdout.readline().decode(\"utf-8\").strip())<\/code><\/pre>\n\n\n\n<p>Se puede finalizar el proceso de una forma amistosa con el m\u00e9todo <strong>terminate<\/strong>, cuando se cumpla una condici\u00f3n o pasado alg\u00fan tiempo, este ejemplo finaliza el proceso despu\u00e9s de cinco segundos de ejecuci\u00f3n. Para ello toma el valor del tiempo de inicio en segundos y lo comprueba con el actual, si es igual o mayor que 5 llama al m\u00e9todo terminate.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import subprocess\nimport time\ninicio = time.time()\np = subprocess.Popen(('find','\/','.'), stdout = subprocess.PIPE)\nwhile p.poll() is None:\n    print(p.stdout.readline().decode(\"utf-8\").strip())\n    if time.time()-inicio >= 5:\n        p.terminate()<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,28],"tags":[2,6,29],"class_list":["post-70","post","type-post","status-publish","format-standard","hentry","category-python","category-subprocess","tag-python","tag-python3","tag-subprocess"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/70","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=70"}],"version-history":[{"count":1,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/70\/revisions"}],"predecessor-version":[{"id":71,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/70\/revisions\/71"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=70"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=70"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=70"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}