Necesito una forma de determinar el espacio restante en un volumen de disco usando python en linux, Windows y OS X. Actualmente estoy analizando el resultado de varias llamadas al sistema (df, dir) para lograr esto, ¿hay una mejor manera?Espacio multiplataforma restante en el volumen usando python
Respuesta
La función os.statvfs() es una mejor manera de obtener esa información para plataformas tipo 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 compilació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.
os.statvfs() no funciona en Windows (Python 2.5.2 - versión de producción actual). – jfs
no plataforma cruzada – pufferfish
I No conozco ninguna forma de plataforma cruzada para lograr esto, pero tal vez una buena solución para usted sería escribir una clase contenedora que verifique el sistema operativo y use el mejor método para cada una.
Para Windows, existe el método GetDiskFreeSpaceEx en las extensiones de win32.
Puede usar df de forma multiplataforma. Es una parte de GNU core utilities. Estas son las utilidades principales que se espera que existan en todos los sistemas operativos. Sin embargo, no están instalados en Windows por defecto (Aquí, GetGnuWin32 es útil).
df es una utilidad de línea de comandos, por lo tanto, se necesita un contenedor para la creación de scripts. 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
No entiendo por qué las personas votaron negativamente. Por ejemplo, esta respuesta puede ser útil para alguien. De todos modos, es un buen complemento para las otras soluciones puto-Pythonic. Si a alguien no le gusta la respuesta, no hay razón para rechazarla. Según entiendo, los downvotes son para respuestas francamente incorrectas. Este no es – ovgolovin
@ovgolovin Hasta vote esta respuesta y es bueno saber otra manera de hacer lo mismo. – Erxin
si no te gusta añadir otra dependencia que pueda para ventanas utilizan ctypes a llamar a la llamada a la función Win32 directamente.
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'
plataforma cruzada ?? – pufferfish
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 GetDiskFreeSpaceEx()
para trabajar (statvfs()
funciona tanto en archivos y directorios). Puede obtener un nombre de directorio desde un archivo con os.path.dirname()
.
Consulte también la documentación para os.statvfs()
y GetDiskFreeSpaceEx
.
'.f_bfree' es la cantidad total de bloques libres en el sistema de archivos. Se debe multiplicar por '.f_bsize' para obtener el número de bytes. – jfs
Al menos en OS X Lion/Python 2.7 Noté que multiplicar por '.f_bsize' da un valor demasiado grande ya que' f_bsize' es el tamaño de bloque * preferred * mientras que '.f_frsize' es el tamaño de bloque * fundamental * y da el valor correcto En mi sistema de prueba de Linux, ambos valores son idénticos y, por lo tanto, '.f_frsize' debería funcionar todo el tiempo. –
Funciona para obtener el disco disponible en el teléfono Android, conectado a través de USB a un sistema Windows, ejecutando el script en Windows. Estupendo. – heltonbiker
Una buena forma de plataforma cruzada es usar psutil: http://pythonhosted.org/psutil/#disks (Tenga en cuenta que necesitará psutil 0.3.0 o superior).
Esta sería la mejor respuesta, pero lamentablemente no se puede instalar psutil a través de pip. –
psutil ya está disponible en pypi y en la mayoría de las otras fuentes, incluidos los paquetes Debian. – Tully
podría utilizar el módulo de wmi para ventanas y os.statvfs para UNIX
para la 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)
No puedo creer lo lejos que tuve que hacer esta pregunta para encontrar a alguien que mencionara el WMI. ¿Todos estos locos usan ctypes para llamar directamente a las API de Windows C cuando simplemente pueden usar el WMI? –
@CraigRinger Sí, tienes razón. Deberíamos usar la herramienta adecuada para hacer lo correcto. La mayoría de las tareas de administración comunes para Windows ya se han completado con win api in wmi. No tenemos que rehacer la rueda. :^D – Erxin
¿Por qué no lo maneja 'psutil'? – Fr0zenFyr
A continuación código devuelve valor correcto en las ventanas
import win32file
def get_free_space(dirname):
secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
return secsPerClus * bytesPerSec * nFreeClus
Desde Python 3.3 que puede utilizar shutil.disk_usage("/").free de la biblioteca estándar para Windows y UNIX:)
Si está ejecutando python3:
Usando shutil.disk_usage()
con os.path.realpath('/')
nombre-regularización de obras:
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 total, utilizado, & espacio libre en MB.
- 1. EditarTexto no ocupará el espacio restante
- 2. hacer que div llene el espacio restante
- 3. Deje que el espacio ocupe el ancho restante?
- 4. ¿Aumenta el volumen en mac usando AppleScript?
- 5. WPF Dockpanel primer hijo utiliza el espacio restante
- 6. Extender WPF ListView vacío para ocupar el espacio restante
- 7. Retire el espacio en blanco en Python usando string.whitespace
- 8. Silverlight: se extiende al espacio restante en StackPanel
- 9. ¿Está el archivo pickle de python multiplataforma?
- 10. ¿Espacio restante entre los elementos (botones) con "margen: 0"?
- 11. Notificador de escritorio multiplataforma en Python
- 12. Android ListView: encabezado/pie de página que llena el espacio restante en la pantalla
- 13. Automatización de una columna de cuadrícula para ocupar el espacio restante en el elemento primario
- 14. Monitorear el volumen en el volumen de Amazon EBS
- 15. ¿Cómo se selecciona la mitad del ancho restante usando css?
- 16. Usando SeekBar para controlar el volumen en android?
- 17. ¿Cómo hacer que una distribución lineal llene el espacio restante en un diseño relativo?
- 18. Algoritmo simplificado para calcular el espacio restante en un búfer circular
- 19. encuentra el tiempo restante en un setTimeout()?
- 20. ¿El color azul restante en :: selección?
- 21. AudioServicesPlaySystemSound Volumen en el iPad
- 22. El volumen de Android MediaPlayer es muy bajo (volumen ajustado)
- 23. Control de volumen usando UIslider Iphone?
- 24. Cómo aumentar el volumen del sonido grabado usando AVAudioRecorder
- 25. Cómo controlar el volumen del sistema usando javascript
- 26. Biblioteca de notificaciones de Python multiplataforma
- 27. Biblioteca MIDI simple, multiplataforma para Python
- 28. Diseño CSS sin tablas de tres filas con una fila central que llena el espacio restante
- 29. CSS: Dos campos, uno izquierdo ancho flexible, uno derecho ocupa el espacio restante
- 30. ¿Cómo hacer que un DIV llene el espacio vertical restante de la ventana del navegador?
Ver esta receta aquí: http://code.activestate.com/recipes/577972-disk-usage/?in=user-4178764 –