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