{"id":67,"date":"2020-05-31T17:27:36","date_gmt":"2020-05-31T17:27:36","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=67"},"modified":"2020-05-31T17:27:38","modified_gmt":"2020-05-31T17:27:38","slug":"subprocess-run","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=67","title":{"rendered":"subprocess.run"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs)<\/h3>\n\n\n\n<p>Este m\u00e9todo ejecuta un proceso con argumentos y devuelve una instancia del proceso completado. Esta instancia tendr\u00e1 atributos de argumentos, c\u00f3digo de retorno (<strong>returncode<\/strong>), salida est\u00e1ndar (<strong>stdout<\/strong>) y error est\u00e1ndar (<strong>stderr<\/strong>). Ni stdout, ni stderr se capturan por defecto, as\u00ed que los atributos ser\u00e1n <strong>None<\/strong>, para poder usarlos, tendremos que pasarles un PIPE para capturarlos.<\/p>\n\n\n\n<p><strong>*popenargs<\/strong> es una tupla que contiene el comando y los argumentos a ejecutar, por ejemplo: (&#8216;ls&#8217;,&#8217;-l&#8217;) o (&#8216;notepad&#8217;,&#8217;nuevanota.txt&#8217;).<\/p>\n\n\n\n<p>Pasaremos el argumento <strong>stdout = subprocess.PIPE<\/strong> para obtener la salida est\u00e1ndar en stdout cuando finalice el proceso y haremos lo mismo con stderr, es decir <strong>stderr = subprocess.PIPE<\/strong> para obtener el error est\u00e1ndar.<\/p>\n\n\n\n<p>Si <strong>check<\/strong> es igual a True y el c\u00f3digo de salida no es cero, se produce una excepci\u00f3n del tipo <strong>CalledProcessError<\/strong>. El objeto CalledProcessError tendr\u00e1 el returncode y el stdout y stderr, si estos \u00faltimos se hubieran capturado.<\/p>\n\n\n\n<p>Si se le proporciona un valor al <strong>timeout<\/strong> en segundos, y el proceso tarda mas de lo indicado, se producir\u00e1 una excepci\u00f3n del tipo <strong>TimeoutExpired<\/strong>.<\/p>\n\n\n\n<p>Existe un argumento opcional que se llama <strong>input<\/strong> que permite pasar bytes o una cadena al subproceso entrada est\u00e1ndar (<strong>stdin<\/strong>). Si se usa este argumento entonces no se puede pasar tambi\u00e9n el constructor de stdin del argumento popen.<\/p>\n\n\n\n<p>La comunicaci\u00f3n por defecto se realiza en bytes, por lo tanto, cualquier input deber\u00eda ser en bytes y la stdout y el stderr tambi\u00e9n lo ser\u00e1n. Si la comunicaci\u00f3n fuera en modo texto, el input deber\u00eda ser un string y el stdout y stderr tambi\u00e9n ser\u00e1n strings decodificadas en base a la codificaci\u00f3n locale.<\/p>\n\n\n\n<p>El siguiente ejemplo ejecuta el comando <strong>ls -l<\/strong> el cual muestra los ficheros que se encuentra en el directorio del programa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import subprocess\nproceso = subprocess.run( ( 'ls' , '-l' ) , stdout = subprocess.PIPE )\nprint( proceso.stdout.decode( \"utf-8\" ) )<\/code><\/pre>\n\n\n\n<p>Se pueden controlar la excepci\u00f3n con <strong>check = True<\/strong>, como en el siguiente ejemplo donde cometemos un error intencionado al buscar en una carpeta que no existe.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">try:\n    p = subprocess.run(('find','\/folder_no_existe','.'), stdout = subprocess.PIPE, check = True)\n    print(p.stdout.decode(\"utf-8\"))\nexcept subprocess.CalledProcessError as e:\n    print('El error es: ', e)<\/code><\/pre>\n\n\n\n<p>El resultado ser\u00e1 esto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pyAdminServers python3 procesos.py\nfind: \/folder_no_existe: No such file or directory\nEl error es:  Command '('find', '\/folder_no_existe', '.')' returned non-zero exit status 1.<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs) Este m\u00e9todo ejecuta un proceso con argumentos y devuelve una instancia del proceso completado. &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":[32,31,2,6,30,29],"class_list":["post-67","post","type-post","status-publish","format-standard","hentry","category-python","category-subprocess","tag-ejecutar","tag-proceso","tag-python","tag-python3","tag-run","tag-subprocess"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/67","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=67"}],"version-history":[{"count":2,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/67\/revisions"}],"predecessor-version":[{"id":69,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/67\/revisions\/69"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}