Seeming discrepancy in shutil.disk_usage()
大家好,StackOverflow,长期读者,第一次海报。希望我有足够的信息来提出一个有用的问题。
我正在使用shutil.disk_usage()函数查找特定路径的当前磁盘使用情况(可用数量、已用数量等)。据我所知,这是一个围绕os.statvfs()调用的包装器。我发现,与Linux中的"du"输出相比,它没有给出我所期望的答案。
出于公司隐私的原因,我隐藏了下面的一些路径,但是输出和代码在其他方面是未经处理的。我使用的是Python3.3.2 64位版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/apps/python/3.3.2_64bit/bin/python3 # test of shutils.diskusage module import shutil BytesPerGB = 1024 * 1024 * 1024 (total, used, free) = shutil.disk_usage("/data/foo/") print ("Total: %.2fGB" % (float(total)/BytesPerGB)) print ("Used: %.2fGB" % (float(used)/BytesPerGB)) (total1, used1, free1) = shutil.disk_usage("/data/foo/utils/") print ("Total: %.2fGB" % (float(total1)/BytesPerGB)) print ("Used: %.2fGB" % (float(used1)/BytesPerGB)) |
输出:
1 2 3 4 5 | /data/foo/drivecode/me % disk_usage_test.py Total: 609.60GB Used: 291.58GB Total: 609.60GB Used: 291.58GB |
如您所见,主要问题是我希望"used"的第二个数量要小得多,因为它是第一个目录的子集。
1 2 | /data/foo/drivecode/me % du -sh /data/foo/utils 2.0G /data/foo/utils |
尽管我非常信任"du",但我发现很难相信python模块也会不正确。因此,可能是我对Linux文件系统的理解造成了问题。:)
我编写了一个模块(很大程度上基于So中某人的代码),它递归地获取磁盘使用情况,直到现在我才使用。它看起来与"du"输出相匹配,但是比shutil.disk的usage()函数慢得多,所以我希望我能使它正常工作。
提前多谢。
问题是Shutil使用下面的
换句话说,您给它指定了路径
1 | used = (st.f_blocks - st.f_bfree) * st.f_frsize |
在哪里?
1 2 3 | fsblkcnt_t f_blocks; /* size of fs in f_frsize units */ fsblkcnt_t f_bfree; /* # free blocks */ unsigned long f_frsize; /* fragment size */ |
这就是为什么它为您提供了整个文件系统上使用的总空间。
事实上,在我看来,
从文档:"返回给定路径的磁盘使用统计信息,作为具有total、used和free属性的命名元组,以字节为单位,表示总空间、已用空间和可用空间的数量。"