跨平台的空间使用python留在体积上

我需要一种方法来确定在Linux,Windows和OS X上使用Python的磁盘卷上剩余的空间。我目前正在parsing各种系统调用(df,dir)的输出来完成这个 – 有没有更好的方法?

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的文档。

您可以使用Windows的wmi模块和unix的os.statvfs

为窗口

 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) 

使用pip install psutilpip install psutil 。 然后您可以使用以下字节获得可用空间的大小:

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

如果您不想添加其他依赖项,则可以使用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' 

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

从Python 3.3开始,您可以使用shutil.disk_usage(“/”)。

os.statvfs()函数是获得Unix类平台(包括OS X)的更好的方法。 Python文档中提到“可用性:Unix”,但在构buildPython时(也就是说文档可能不是最新的),也值得检查它是否也能在Windows上工作。

否则,可以使用pywin32库直接调用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 

下面的代码在windows上返回正确的值

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

我不知道任何跨平台的方式来实现这一点,但也许一个很好的解决方法,你会写一个包装类,检查操作系统,并使用最好的方法。

对于Windows,win32扩展中有GetDiskFreeSpaceEx方法。