使用python的卷上剩余的跨平台空间

时间:2020-03-05 18:49:59  来源:igfitidea点击:

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

解决方案

回答

os.statvfs()函数是在类似Unix的平台(包括OS X)上获取该信息的更好方法。 Python文档中说" Availability:Unix",但是值得一看的是,在我们构建的Python版本中它是否也可以在Windows上运行(即,文档可能不是最新的)。

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

回答

我不知道有任何跨平台的方法来实现这一目标,但是对于我们来说,一个不错的解决方法是编写一个包装类,该类检查操作系统并为每个操作系统使用最佳方法。

对于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

回答

如果我们不想添加其他依赖项,则可以为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的文档。