Мне нужен способ определить пространство, оставшееся на томе диска, используя python для linux, Windows и OS X. В настоящее время я разбираю вывод различных системных вызовов (df, dir), чтобы выполнить это - есть ли лучший способ?
Кросс-платформенное пространство, оставшееся на томе с использованием python
Ответ 1
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
Обратите внимание, что вы должны передать имя каталога для GetDiskFreeSpaceEx()
для работы
(statvfs()
работает как с файлами, так и с каталогами). Вы можете получить имя каталога
из файла с os.path.dirname()
.
Также см. документацию для os.statvfs()
и GetDiskFreeSpaceEx
.
Ответ 2
Вы можете использовать wmi модуль для windows и os.statvfs для unix
для окна
import wmi
c = wmi.WMI ()
for d in c.Win32_LogicalDisk():
print( d.Caption, d.FreeSpace, d.Size, d.DriveType)
для unix или linux
from os import statvfs
statvfs(path)
Ответ 3
Установите psutil с помощью pip install psutil
. Затем вы можете получить количество свободного места в байтах, используя:
import psutil
print(psutil.disk_usage(".").free)
Ответ 4
Если вы не хотите добавлять другую зависимость, вы можете использовать windows ctypes для вызова вызова функции 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'
Ответ 5
Хорошим межплатформенным способом является использование psutil: http://pythonhosted.org/psutil/#disks (Обратите внимание, что вам понадобится psutil 0.3.0 или выше).
Ответ 6
Из Python 3.3 вы можете использовать shutil.disk_usage ( "/" ) бесплатно из стандартной библиотеки для Windows и UNIX:)
Ответ 7
Функция os.statvfs() - лучший способ получить эту информацию для Unix-подобных платформ (включая OS X). В документации на Python говорится: "Доступность: Unix", но стоит проверить, работает ли она на Windows в вашей сборке Python (то есть документы могут быть неактуальными).
В противном случае вы можете использовать библиотеку pywin32, чтобы напрямую вызвать GetDiskFreeSpaceEx.
Ответ 8
Вы можете использовать df как кросс-платформенный способ. Это часть основных утилит GNU. Это основные утилиты, которые, как ожидается, будут существовать в каждой операционной системе. Однако они по умолчанию не установлены в Windows (здесь GetGnuWin32 пригодится).
df - утилита командной строки, поэтому для сценариев требуется оболочка. Например:
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
Ответ 9
Ниже код возвращает правильное значение для окон
import win32file
def get_free_space(dirname):
secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
return secsPerClus * bytesPerSec * nFreeClus
Ответ 10
Я не знаю какого-либо кросс-платформенного способа достижения этого, но, возможно, хорошим решением для вас было бы написать класс-оболочку, который проверяет операционную систему и использует лучший метод для каждого.
Для Windows существует способ GetDiskFreeSpaceEx в расширениях win32.