Espacio multiplataforma que queda en el volumen usando python

Necesito una forma de determinar el espacio restante en un volumen de disco usando Python en Linux, Windows y OS X. Actualmente estoy analizando la salida de las diversas llamadas del sistema (df, dir) para lograr esto. ¿Hay alguna manera mejor?

import ctypes import os import platform import sys def get_free_space_mb(dirname): """Return folder/drive free space (in megabytes).""" if platform.system() == 'Windows': free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dirname), None, None, ctypes.pointer(free_bytes)) return free_bytes.value / 1024 / 1024 else: st = os.statvfs(dirname) return st.f_bavail * st.f_frsize / 1024 / 1024 

Tenga en cuenta que debe pasar un nombre de directorio para que GetDiskFreeSpaceEx() funcione ( statvfs() funciona tanto en archivos como en directorios). Puede obtener un nombre de directorio de un archivo con os.path.dirname() .

También vea la documentación para os.statvfs() y GetDiskFreeSpaceEx .

Instalar psutil usando pip install psutil . Luego puede obtener la cantidad de espacio libre en bytes usando:

 import psutil print(psutil.disk_usage(".").free) 

Podría usar el módulo wmi para windows y os.statvfs para unix

para ventana

 import wmi c = wmi.WMI () for d in c.Win32_LogicalDisk(): print( d.Caption, d.FreeSpace, d.Size, d.DriveType) 

para unix o linux

 from os import statvfs statvfs(path) 

Si no te gusta agregar otra dependencia, puedes usar Windows para ctypes para llamar directamente a la función win32.

 import ctypes free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(u'c:\\'), None, None, ctypes.pointer(free_bytes)) if free_bytes.value == 0: print 'dont panic' 

Una buena forma multiplataforma es usar psutil: http://pythonhosted.org/psutil/#disks (Tenga en cuenta que necesitará psutil 0.3.0 o superior).

Desde Python 3.3 puede usar shutil.disk_usage (“/”). Libre de la biblioteca estándar tanto para Windows como para UNIX 🙂

Si estás ejecutando python3:

El uso de shutil.disk_usage() con os.path.realpath('/') funciona de regularización de nombres:

 from os import path from shutil import disk_usage print([i / 1000000 for i in disk_usage(path.realpath('/'))]) 

O

 total_bytes, used_bytes, free_bytes = disk_usage(path.realpath('D:\\Users\\phannypack')) print(total_bytes / 1000000) # for Mb print(used_bytes / 1000000) print(free_bytes / 1000000) 

dándole el espacio total, usado y libre en MB.

Puedes usar df como una plataforma multiplataforma. Es una parte de las utilidades principales de GNU . Estas son las utilidades principales que se espera que existan en cada sistema operativo. Sin embargo, no se instalan en Windows de forma predeterminada (aquí, GetGnuWin32 es muy útil).

df es una utilidad de línea de comandos, por lo tanto, un contenedor requerido para propósitos de scripting. Por ejemplo:

 from subprocess import PIPE, Popen def free_volume(filename): """Find amount of disk space available to the current user (in bytes) on the file system containing filename.""" stats = Popen(["df", "-Pk", filename], stdout=PIPE).communicate()[0] return int(stats.splitlines()[1].split()[3]) * 1024 

La función os.statvfs () es una mejor manera de obtener esa información para plataformas similares a Unix (incluido OS X). La documentación de Python dice “Disponibilidad: Unix”, pero vale la pena comprobar si también funciona en Windows en tu comstackción de Python (es decir, es posible que los documentos no estén actualizados).

De lo contrario, puede usar la biblioteca pywin32 para llamar directamente a la función GetDiskFreeSpaceEx .

A continuación el código devuelve el valor correcto en Windows

 import win32file def get_free_space(dirname): secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname) return secsPerClus * bytesPerSec * nFreeClus 

No conozco ninguna forma multiplataforma para lograr esto, pero tal vez una buena solución para usted sería escribir una clase de contenedor que compruebe el sistema operativo y utilice el mejor método para cada uno.

Para Windows, existe el método GetDiskFreeSpaceEx en las extensiones win32.