我需要一种在Linux,Windows和OS X上使用python来确定磁盘卷上剩余空间的方法。我目前正在解析各种系统调用(df,dir)的输出以实现此目的-有更好的方法吗?
我需要一种在Linux,Windows和OS X上使用python来确定磁盘卷上剩余空间的方法。我目前正在解析各种系统调用(df,dir)的输出以实现此目的-有更好的方法吗?
Answers:
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
。
.f_bfree
是文件系统中可用块的总数。应该乘以.f_bsize
得到字节数。
.f_bsize
给人以过于大的值f_bsize
是首选块大小,同时.f_frsize
是基本的块大小,并给出了正确的值。在我的linux测试系统上,两个值相同,因此.f_frsize
应该一直工作。
使用安装psutilpip install psutil
。然后,您可以使用以下命令获取可用空间(以字节为单位):
import psutil
print(psutil.disk_usage(".").free)
psutil
。由于disk_usage.free
通常会返回一个巨大的64b整数,因此我建议您也想向人们展示disk_usage.percent
。psutil.disk_usage(".").percent < 99.9
对我来说似乎更清晰...
您可以将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)
对于Unix或Linux
from os import statvfs
statvfs(path)
psutil
处理呢?
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('/'))])
要么
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)
为您提供总空间,已用空间和可用空间(以MB为单位)。
如果您不想添加其他依赖项,则可以为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'
一种跨平台的好方法是使用psutil:http ://pythonhosted.org/psutil/#disks (请注意,您将需要psutil 0.3.0或更高版本)。
在Python 3.3中,您可以从Windows和UNIX的标准库中使用shutil.disk_usage(“ /”)。free:)
您可以将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
该os.statvfs()函数是一个更好的方式来得到这样的Unix平台(包括OS X)该信息。Python文档说“ Availability:Unix”,但是在您构建的Python版本中,值得检查它是否也可以在Windows上运行(即,文档可能不是最新的)。
否则,您可以使用pywin32库直接调用GetDiskFreeSpaceEx函数。
我不知道有任何跨平台的方法来实现这一目标,但是对您来说,一个不错的解决方法是编写一个包装类,该类检查操作系统并为每个操作系统使用最佳方法。
对于Windows,win32扩展中包含GetDiskFreeSpaceEx方法。