使用python在卷上保留跨平台空间

70 python linux windows macos diskspace

我需要一种方法来确定在Linux,Windows和OS X上使用python在磁盘卷上剩余的空间.我正在解析各种系统调用的输出(df,dir)来实现这一点 - 有更好的方法吗?

Fra*_*dan 74

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
Run Code Online (Sandbox Code Playgroud)

请注意,您必须传递目录名称GetDiskFreeSpaceEx()才能工作(statvfs()适用于文件和目录).您可以从文件中获取目录名称os.path.dirname().

另请参阅文件os.statvfs()GetDiskFreeSpaceEx.

  • `.f_bfree`是文件系统中空闲块的总数.它应该乘以`.f_bsize`来获得字节数. (13认同)
  • 至少在OS X Lion/Python 2.7上,我注意到乘以`.f_bsize`会给出一个太大的值,因为`f_bsize`是*preferred*块大小,而`.f_frsize`是*基本*块大小并且给出了正确的价值.在我的linux测试系统中,两个值都是相同的,因此`.f_frsize`应该始终有效. (8认同)

jha*_*sse 26

使用安装psutilpip install psutil.然后您可以使用以下字节获取可用空间量(以字节为单位)

import psutil
print(psutil.disk_usage(".").free)
Run Code Online (Sandbox Code Playgroud)

  • 为什么这不是最佳答案? (2认同)
  • 我认为是因为psutil并不总是可以通过pypi获得。 (2认同)

Erx*_*xin 24

您可以将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)
Run Code Online (Sandbox Code Playgroud)

对于unix或linux

from os import statvfs

statvfs(path)
Run Code Online (Sandbox Code Playgroud)

  • 我不敢相信我必须在这个问题上走多远才能找到提到 WMI 的人。当他们可以使用 WMI 时,所有这些疯狂的人使用 ctypes 直接调用 Windows C API 吗? (2认同)
  • 这就是我喜欢 stackoverflow 的原因。我什至不知道 WMI 模块,它完美地工作。 (2认同)

Rob*_*xal 8

如果您正在运行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('/'))])
Run Code Online (Sandbox Code Playgroud)

要么

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)
Run Code Online (Sandbox Code Playgroud)

为您提供总空间,已用空间和可用空间(以MB为单位)。


Ste*_*röm 6

如果您不想添加另一个依赖项,您可以使用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'
Run Code Online (Sandbox Code Playgroud)

  • 跨平台? (3认同)

小智 5

一个很好的跨平台方式是使用psutil:http://pythonhosted.org/psutil/#disks (注意你需要psutil 0.3.0或更高版本).

  • psutil 现在可以从 pypi 和大多数其他来源(包括 debian 软件包)获得。 (2认同)

Miš*_*išo 5

从Python 3.3你可以使用shutil.disk_usage("/").从Windows和UNIX的标准库中免费 :)


Gre*_*ill 1

os.statvfs ()函数是获取类 Unix 平台(包括 OS X)信息的更好方法。Python 文档说“可用性:Unix”,但值得在您的 Python 构建中检查它是否也适用于 Windows(即文档可能不是最新的)。

否则,您可以使用pywin32库直接调用GetDiskFreeSpaceEx函数。

  • os.statvfs() 不适用于 Windows(Python 2.5.2——当前生产版本)。 (3认同)