Кроссплатформенное пространство, оставшееся на томе с использованием Python - PullRequest
67 голосов
/ 09 сентября 2008

Мне нужен способ определить место, оставшееся на томе диска, используя python в Linux, Windows и OS X. В настоящее время я анализирую выходные данные различных системных вызовов (df, dir), чтобы выполнить это - есть ли лучше?

Ответы [ 11 ]

71 голосов
/ 03 марта 2010
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.

23 голосов
/ 29 апреля 2015

Установка psutil с использованием pip install psutil. Тогда вы можете получить количество свободного места в байтах, используя:

import psutil
print(psutil.disk_usage(".").free)
22 голосов
/ 12 октября 2013

Вы можете использовать модуль 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)
6 голосов
/ 13 ноября 2009

Если вы не хотите добавлять другую зависимость, вы можете для окон использовать 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 голосов
/ 11 августа 2016

В Python 3.3 вы можете использовать shutil.disk_usage ("/"). Free из стандартной библиотеки для Windows и UNIX:)

5 голосов
/ 21 июля 2011

Хороший кроссплатформенный способ использует psutil: http://pythonhosted.org/psutil/#disks (Обратите внимание, что вам понадобится psutil 0.3.0 или выше).

4 голосов
/ 01 февраля 2018

Если вы используете Python3:

Использование shutil.disk_usage() с os.path.realpath('/') имя-регуляризация работает:

from os import path
from shutil import disk_usage

print([i / 1000000 for i in disk_usage(path.realpath('/'))])

Или

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)

с указанием общего, использованного и свободного места в МБ.

2 голосов
/ 10 сентября 2008

Вы можете использовать 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
2 голосов
/ 09 сентября 2008

Функция os.statvfs () - лучший способ получить эту информацию для Unix-подобных платформ (включая OS X). В документации по Python написано «Доступность: Unix», но стоит проверить, работает ли она и в Windows, в вашей сборке Python (т. Е. Документы могут не обновляться).

В противном случае вы можете использовать библиотеку pywin32 для прямого вызова функции GetDiskFreeSpaceEx .

1 голос
/ 08 марта 2016

Код ниже возвращает правильное значение в окнах

import win32file    

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