{"id":236,"date":"2020-09-17T19:42:33","date_gmt":"2020-09-17T17:42:33","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=236"},"modified":"2021-07-31T18:55:00","modified_gmt":"2021-07-31T16:55:00","slug":"psutil","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=236","title":{"rendered":"Procesos y monitorizaci\u00f3n con psutil"},"content":{"rendered":"\n<p><strong>Psutil<\/strong>&nbsp;(process and system utilities), es una librer\u00eda Python que obtiene informaci\u00f3n de los procesos y utilizaci\u00f3n del sistema como pueden ser la cpu, memoria, discos, redes o sensores y que funciona bajo Windows, MacOS o Linux.<\/p>\n\n\n\n<p>Antes de hacer la instalaci\u00f3n en Linux, tendremos que instalar previamente gcc y python3-dev.<\/p>\n\n\n\n<p>Para instalarlo en distribuciones Debian como Ubuntu usaremos el comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># apt install gcc python3-dev\n# pip3 install psutil<\/code><\/pre>\n\n\n\n<p>En el caso de distribuciones basadas en&nbsp;<strong>Redhat<\/strong>&nbsp;se instala as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># yum install gcc python3-devel\n# pip3 install psutil<\/code><\/pre>\n\n\n\n<p>Para instalarla en&nbsp;<strong>Windows<\/strong>&nbsp;debemos ejecutar el comando&nbsp;<strong>pip<\/strong>&nbsp;de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># pip install psutil<\/code><\/pre>\n\n\n\n<p>Para instalarlo en&nbsp;<strong>MacOS<\/strong>&nbsp;usaremos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># pip3 install psutil<\/code><\/pre>\n\n\n\n<p>Vamos a usar el interprete interactivo de Python para comprobar los m\u00e9todos principales. Para ello ejecutamos el interprete escribiendo el siguiente comando en el s\u00edmbolo del sistema o terminal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"># python3<\/code><\/pre>\n\n\n\n<p>Antes de usar los m\u00e9todos de esta librer\u00eda primero debemos importarla en Python con el comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; import psutil<\/code><\/pre>\n\n\n\n<p>Comencemos por revisar el n\u00famero de procesadores l\u00f3gicos que posee nuestro dispositivo con el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; print('Procesadores l\u00f3gicos: %s' %psutil.cpu_count())<\/code><\/pre>\n\n\n\n<p>Y obtendremos el siguiente resultado, dependiendo del dispositivo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; Procesadores l\u00f3gicos: 4<\/code><\/pre>\n\n\n\n<p>El m\u00e9todo&nbsp;<strong>cpu_count<\/strong>&nbsp;obtiene el n\u00famero de procesadores l\u00f3gicos del dispositivo, si lo que queremos ver es el n\u00famero de procesadores f\u00edsicos deberemos obtener el valor pasando el atributo&nbsp;<strong>logical<\/strong>&nbsp;igual a&nbsp;<strong>False<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; psutil.cpu_count(logical=False)\n2<\/code><\/pre>\n\n\n\n<p>Para obtener informaci\u00f3n de las particiones de disco disponibles en el dispositivo usamos el siguiente m\u00e9todo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; psutil.disk_partitions()\n[sdiskpart(device='\/dev\/sda1', mountpoint='\/', fstype='ext4', opts='rw,relatime,errors=remount-ro')]<\/code><\/pre>\n\n\n\n<p>Para obtener una lista con los valores de uso de disco usamos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; psutil.disk_usage('\/')\nsdiskusage(total=18889785344, used=15598764032, free=2307878912, percent=87.1)<\/code><\/pre>\n\n\n\n<p>Si queremos ver el tama\u00f1o total de la partici\u00f3n, el tama\u00f1o usado y el espacio disponible, podemos localizarlos en la lista.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; usodisco = psutil.disk_usage('\/')\n&gt;&gt;&gt; usodisco\nsdiskusage(total=18889785344, used=15598800896, free=2307842048, percent=87.1)\n&gt;&gt;&gt; usodisco.total\n18889785344\n&gt;&gt;&gt; usodisco.used\n15598800896\n&gt;&gt;&gt; usodisco.free\n2307842048\n&gt;&gt;&gt; usodisco.percent\n87.1\n<\/code><\/pre>\n\n\n\n<p>Con esto podr\u00edamos, por ejemplo, monitorizar el espacio disponible de una partici\u00f3n. Para hacer estos valores mas humanos pod\u00e9is dividir entre 1024 para KBs, (1024*1024) para MBs o (1024*1024*1024) para GBs.&nbsp;<\/p>\n\n\n\n<p>Para ver los m\u00e9todos que dispone la librer\u00eda podemos hacer uso de&nbsp;<strong>dir()<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; dir(psutil)\n['AF_LINK', 'AIX', 'AccessDenied', 'BSD', 'CONN_CLOSE', 'CONN_CLOSE_WAIT', 'CONN_CLOSING', 'CONN_ESTABLISHED', 'CONN_FIN_WAIT1', 'CONN_FIN_WAIT2', 'CONN_LAST_ACK', 'CONN_LISTEN', 'CONN_NONE', 'CONN_SYN_RECV', 'CONN_SYN_SENT', 'CONN_TIME_WAIT', 'Error', 'FREEBSD', 'IOPRIO_CLASS_BE', 'IOPRIO_CLASS_IDLE', 'IOPRIO_CLASS_NONE', 'IOPRIO_CLASS_RT', 'LINUX', 'MACOS', 'NETBSD', 'NIC_DUPLEX_FULL', 'NIC_DUPLEX_HALF', 'NIC_DUPLEX_UNKNOWN', 'NoSuchProcess', 'OPENBSD', 'OSX', 'POSIX', 'POWER_TIME_UNKNOWN', 'POWER_TIME_UNLIMITED', 'PROCFS_PATH', 'PermissionError', 'Popen', 'Process', 'ProcessLookupError', 'RLIMIT_AS', 'RLIMIT_CORE', 'RLIMIT_CPU', 'RLIMIT_DATA', 'RLIMIT_FSIZE', 'RLIMIT_LOCKS', 'RLIMIT_MEMLOCK', 'RLIMIT_MSGQUEUE', 'RLIMIT_NICE', 'RLIMIT_NOFILE', 'RLIMIT_NPROC', 'RLIMIT_RSS', 'RLIMIT_RTPRIO', 'RLIMIT_RTTIME', 'RLIMIT_SIGPENDING', 'RLIMIT_STACK', 'RLIM_INFINITY', 'STATUS_DEAD', 'STATUS_DISK_SLEEP', 'STATUS_IDLE', 'STATUS_LOCKED', 'STATUS_PARKED', 'STATUS_RUNNING', 'STATUS_SLEEPING', 'STATUS_STOPPED', 'STATUS_TRACING_STOP', 'STATUS_WAITING', 'STATUS_WAKING', 'STATUS_ZOMBIE', 'SUNOS', 'TimeoutExpired', 'WINDOWS', 'ZombieProcess', '_LOWEST_PID', '_PY3', '_SENTINEL', '_TOTAL_PHYMEM', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_as_dict_attrnames', '_assert_pid_not_reused', '_common', '_compat', '_cpu_busy_time', '_cpu_times_deltas', '_cpu_tot_time', '_last_cpu_times', '_last_cpu_times_2', '_last_per_cpu_times', '_last_per_cpu_times_2', '_lock', '_pmap', '_ppid_map', '_pprint_secs', '_pslinux', '_psplatform', '_psposix', '_psutil_linux', '_psutil_posix', '_timer', '_wrap_numbers', 'boot_time', 'collections', 'contextlib', 'cpu_count', 'cpu_freq', 'cpu_percent', 'cpu_stats', 'cpu_times', 'cpu_times_percent', 'datetime', 'disk_io_counters', 'disk_partitions', 'disk_usage', 'functools', 'getloadavg', 'long', 'net_connections', 'net_if_addrs', 'net_if_stats', 'net_io_counters', 'os', 'pid_exists', 'pids', 'process_iter', 'pwd', 'sensors_battery', 'sensors_fans', 'sensors_temperatures', 'signal', 'subprocess', 'swap_memory', 'sys', 'test', 'threading', 'time', 'users', 'version_info', 'virtual_memory', 'wait_procs']\n<\/code><\/pre>\n\n\n\n<p>Y luego ver la ayuda del m\u00e9todo usando&nbsp;<strong>help()<\/strong>, como por ejemplo para averiguar como funciona el m\u00e9todo sensors_battery con el cual obtendremos el porcentaje o tiempo disponible o si el dispositivo est\u00e1 conectado a corriente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"> &gt;&gt;&gt; help(psutil.sensors_battery)\nHelp on function sensors_battery in module psutil:\n\nsensors_battery()\n    Return battery information. If no battery is installed\n    returns None.\n    \n     - percent: battery power left as a percentage.\n     - secsleft: a rough approximation of how many seconds are left\n                 before the battery runs out of power. May be\n                 POWER_TIME_UNLIMITED or POWER_TIME_UNLIMITED.\n     - power_plugged: True if the AC power cable is connected.\n(END)\n<\/code><\/pre>\n\n\n\n<p>Si queremos ver el porcentaje de bater\u00eda disponible podemos hacerlo con&nbsp;<strong>percent<\/strong>, recordad que si el dispositivo no dispone de bater\u00eda el valor obtenido ser\u00e1&nbsp;<strong>None<\/strong>. Veamos un ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">&gt;&gt;&gt; bater\u00eda = psutil.sensors_battery()\n&gt;&gt;&gt; bater\u00eda.percent\n33<\/code><\/pre>\n\n\n\n<p>Si se os ocurre alg\u00fan otro uso, por favor, compartidlo.<\/p>\n\n\n\n<p>Gracias.<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/www.buymeacoffee.com\/pythonparatodo\" target=\"_blank\">Si te ha servido de ayuda, inv\u00edtame a un caf\u00e9.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Psutil&nbsp;(process and system utilities), es una librer\u00eda Python que obtiene informaci\u00f3n de los procesos y utilizaci\u00f3n del sistema como pueden &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[108,4],"tags":[110,109,111,6],"class_list":["post-236","post","type-post","status-publish","format-standard","hentry","category-procesos-y-monitorizacion","category-python","tag-monitorizacion","tag-procesos","tag-psutil","tag-python3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/236","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=236"}],"version-history":[{"count":5,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/236\/revisions"}],"predecessor-version":[{"id":303,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/236\/revisions\/303"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}