2008-09-09 2 views
61

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

+1

Просмотреть этот рецепт здесь: http://code.activestate.com/recipes/577972-disk-usage/?in=user-4178764 – 2012-07-10 17:46:31

ответ

2

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

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

+2

os.statvfs() не работает в Windows (Python 2.5.2 - текущая производственная версия). – jfs 2008-09-29 22:33:53

+2

не перекрестная платформа – pufferfish 2010-04-19 16:12:37

0

Я не знаю какого-либо кросс-платформенного способа достижения этого, но, возможно, хорошим решением для вас было бы написать класс-оболочку, который проверяет операционную систему и использует лучший метод для каждого.

Для Windows существует метод GetDiskFreeSpaceEx в расширениях win32.

2

Вы можете использовать df как кросс-платформенный способ. Он входит в состав GNU core utilities. Это основные утилиты, которые, как ожидается, будут существовать в каждой операционной системе. Однако они по умолчанию не установлены в 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 
+4

Я не понимаю, почему люди сбиты. Например, этот ответ может быть полезен кому-то. Во всяком случае, это хорошее дополнение для других кукольно-питонических решений. Если кому-то не нравится ответ, нет причин его понижать. Насколько я понимаю, downvotes для совершенно неправильных ответов. Это не так. – ovgolovin 2014-04-28 19:15:19

+0

@ovgolovin Назовите этот ответ, и хорошо знать другой способ сделать то же самое. – Erxin 2015-04-24 03:05:25

5

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

кросс-платформу ?? – pufferfish 2010-04-19 16:12:13

65
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.

+13

`.f_bfree` - общее количество свободных блоков в файловой системе. Его нужно умножить на `.f_bsize`, чтобы получить количество байтов. – jfs 2010-04-25 16:14:55

+8

По крайней мере, на OS X Lion/Python 2.7 Я заметил, что умножение на `.f_bsize` дает слишком большое значение, так как` f_bsize` является * предпочтительным размером блока, а `.f_frsize` является * основным размером блока и дает правильное значение. В моей тестовой системе linux оба значения идентичны, и поэтому `.f_frsize` должен работать все время. – 2011-11-30 08:34:12

17

Вы можете использовать wmi модуль для окон и 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) 
13

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

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

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

import win32file  

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

Если вы работаете 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) 

дает вам общую, использованную & свободного пространства в мегабайтах.

Смежные вопросы