Ich benötige eine Möglichkeit, den verbleibenden Speicherplatz auf einem Datenträger mithilfe von Python unter Linux, Windows und OS X zu ermitteln. Ich analysiere derzeit die Ausgabe der verschiedenen Systemaufrufe (df, dir), um dies zu erreichen. Gibt es einen besseren Weg?
72
Antworten:
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
Beachten Sie, dass Sie einen Verzeichnisnamen übergeben müssen
GetDiskFreeSpaceEx()
, damit dies funktioniert (statvfs()
funktioniert sowohl für Dateien als auch für Verzeichnisse). Sie können einen Verzeichnisnamen aus einer Datei mit abrufenos.path.dirname()
.Siehe auch die Dokumentation zu
os.statvfs()
undGetDiskFreeSpaceEx
.quelle
.f_bfree
ist die Gesamtzahl der freien Blöcke im Dateisystem. Es sollte mit multipliziert werden.f_bsize
, um die Anzahl der Bytes zu erhalten..f_bsize
einen viel zu großen Wert ergibt, ebensof_bsize
wie die bevorzugte Blockgröße, während.f_frsize
die grundlegende Blockgröße und der richtige Wert sind. Auf meinem Linux-Testsystem sind beide Werte identisch und.f_frsize
sollten daher immer funktionieren.Installieren Sie psutil mit
pip install psutil
. Dann können Sie die Menge an freiem Speicherplatz in Bytes ermitteln, indem Sie:import psutil print(psutil.disk_usage(".").free)
quelle
psutil
. Dadisk_usage.free
normalerweise eine große 64b-Ganzzahl zurückgegeben wird, sollten Sie auch Personen anzeigendisk_usage.percent
.psutil.disk_usage(".").percent < 99.9
scheint mir klarer ...Sie können das wmi- Modul für Windows und os.statvfs für Unix verwenden
für Fenster
import wmi c = wmi.WMI () for d in c.Win32_LogicalDisk(): print( d.Caption, d.FreeSpace, d.Size, d.DriveType)
für Unix oder Linux
from os import statvfs statvfs(path)
quelle
psutil
umgehen?Wenn Sie python3 ausführen:
Verwendung
shutil.disk_usage()
mitos.path.realpath('/')
Namensregulierung funktioniert:from os import path from shutil import disk_usage print([i / 1000000 for i in disk_usage(path.realpath('/'))])
Oder
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)
Geben Sie den gesamten, verwendeten und freien Speicherplatz in MB an.
quelle
Wenn Sie keine weitere Abhängigkeit hinzufügen möchten, können Sie für Windows ctypes verwenden, um den Funktionsaufruf win32 direkt aufzurufen.
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'
quelle
Eine gute plattformübergreifende Methode ist die Verwendung von psutil: http://pythonhosted.org/psutil/#disks (Beachten Sie, dass Sie psutil 0.3.0 oder höher benötigen).
quelle
Ab Python 3.3 können Sie shutil.disk_usage ("/") verwenden. Frei von der Standardbibliothek für Windows und UNIX :)
quelle
Sie können df plattformübergreifend verwenden. Es ist Teil der GNU-Kerndienstprogramme . Dies sind die Kerndienstprogramme, die auf jedem Betriebssystem vorhanden sein sollen. Sie werden jedoch standardmäßig nicht unter Windows installiert (hier ist GetGnuWin32 nützlich).
df ist ein Befehlszeilenprogramm, daher ein Wrapper, der für Skriptzwecke benötigt wird. Zum Beispiel:
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
quelle
Der folgende Code gibt unter Windows den korrekten Wert zurück
import win32file def get_free_space(dirname): secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname) return secsPerClus * bytesPerSec * nFreeClus
quelle
Die Funktion os.statvfs () ist eine bessere Möglichkeit, diese Informationen für Unix-ähnliche Plattformen (einschließlich OS X) abzurufen . In der Python-Dokumentation steht "Verfügbarkeit: Unix", es lohnt sich jedoch zu prüfen, ob es auch in Ihrem Python-Build unter Windows funktioniert (dh die Dokumente sind möglicherweise nicht auf dem neuesten Stand).
Andernfalls können Sie die pywin32- Bibliothek verwenden, um die GetDiskFreeSpaceEx- Funktion direkt aufzurufen .
quelle
Ich kenne keinen plattformübergreifenden Weg, um dies zu erreichen, aber vielleicht wäre eine gute Problemumgehung für Sie, eine Wrapper-Klasse zu schreiben, die das Betriebssystem überprüft und für jede die beste Methode verwendet.
Für Windows gibt es die GetDiskFreeSpaceEx- Methode in den win32-Erweiterungen.
quelle