Межплатформенное пространство, оставшееся на томе с использованием Python

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

Смотрите этот рецепт здесь: code.activestate.com/recipes/577972-disk-usage/?in=user-4178‌ 764

Giampaolo Rodolà 10.07.2012 21:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
72
1
40 703
11

Ответы 11

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

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

os.statvfs () не работает в Windows (Python 2.5.2 - текущая производственная версия).

jfs 30.09.2008 02:33

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

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

Вы можете использовать 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

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

ovgolovin 28.04.2014 23:15

@ovgolovin Up проголосуйте за этот ответ, и хорошо бы знать другой способ сделать то же самое.

Erxin 24.04.2015 06:05

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

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.

.f_bfree - общее количество свободных блоков в файловой системе. Его нужно умножить на .f_bsize, чтобы получить количество байтов.

jfs 25.04.2010 20:14

По крайней мере, в OS X Lion / Python 2.7 я заметил, что умножение на .f_bsize дает слишком большое значение, поскольку f_bsize - это размер блока предпочтительный, а .f_frsize - размер блока фундаментальный и дает правильное значение. В моей тестовой системе linux оба значения идентичны, поэтому .f_frsize должен работать постоянно.

Dennis Bliefernicht 30.11.2011 12:34

Работает, чтобы получить доступный диск на телефоне Android, подключенном через USB к системе Windows, запустив скрипт в Windows. Большой.

heltonbiker 04.09.2013 21:36

@ J.F.Sebastian Это зависит от того, чего вы хотите. Linux может зарезервировать место для root. Если вы хотите включить это пространство, используйте f_bfree. Если вы хотите получить количество блоков, доступных пользователю, используйте f_bavail. Может кто-нибудь скажет, если и как трактуются квоты?

data 11.11.2013 22:44

У меня есть три мелочи с указанным выше: 1 / Строка документации неверна, она возвращает пространство в мегабайтах и ​​2 / Мне никогда не нравится видеть более одного оператора возврата (я думаю, слишком много времени, как тестировщик), поэтому я бы сохранил результат в возвращаемое значение, 3 / целый МБ или десятичный МБ может иметь значение для некоторых людей.

Steve Barnes 06.06.2014 10:05

Вы также можете проверить платформу через систему sys.platform == 'win32', также доступна под os! Итак: os.sys.platform == 'win32'. Снижение до 2-х импортных! ;]

ewerybody 14.11.2018 13:20

или os.name == 'nt'!

ewerybody 14.11.2018 13:28

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

Это был бы лучший ответ, но, к сожалению, psutil нельзя установить через pip.

Gringo Suave 16.01.2013 05:58

psutil теперь доступен из pypi и большинства других источников, включая пакеты debian.

Tully 06.01.2015 01:21

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

Не могу поверить, как далеко мне пришлось зайти в этот вопрос, чтобы найти кого-то, кто упоминает WMI. Все эти сумасшедшие люди, использующие ctypes для прямого вызова Windows C API, когда они могли просто использовать WMI?

Craig Ringer 23.04.2015 06:51

@CraigRinger Да, вы правы. Чтобы поступать правильно, мы должны использовать правильный инструмент. Большинство общих задач управления окном уже заключены в win api в wmi. Колесо переделывать не нужно. : ^ D

Erxin 24.04.2015 05:25

Почему psutil не справится с этим?

Fr0zenFyr 21.11.2015 15:03

Вот почему я люблю stackoverflow. Я даже не знал о модуле WMI, и он работал безупречно.

DanGoodrick 15.03.2016 21:18

@ Fr0zenFyr да, это еще один хороший вариант для решения этой задачи.

Erxin 30.09.2016 11:08

Что ж, если вы хотите поддерживать oldschool python 2.7 ваниль: вам нужно сделать эти вещи. Чем меньше внешних зависимостей, тем лучше. ctypes встроен! ?

ewerybody 14.11.2018 13:24

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

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

Почему это не лучший ответ?

jayatubi 01.06.2016 06:35

Я думаю, потому что psutil не всегда был доступен через pypi.

jhasse 01.06.2016 11:01

Я согласен, это отличный ответ. Я исправил устаревшую ссылку на psutil. Поскольку disk_usage.free обычно возвращает огромное целое число 64b, я предлагаю вам также показать людям disk_usage.percent. psutil.disk_usage(".").percent < 99.9 мне кажется понятнее ...

smci 08.01.2019 12:15

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

import win32file    

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

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

Если вы используете 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)

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

Другие вопросы по теме