跨平台的空间使用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 psutil
来pip 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方法。