Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python shutil.disk_使用情况()中似乎存在差异_Python_Linux_Shutil - Fatal编程技术网

Python shutil.disk_使用情况()中似乎存在差异

Python shutil.disk_使用情况()中似乎存在差异,python,linux,shutil,Python,Linux,Shutil,各位好, 长期读者,第一次海报。希望我这里有所有的信息来提出一个有用的问题 我正在使用shutil.disk_usage()函数查找特定路径的当前磁盘使用量(可用量、使用量等)。据我所知,这是一个围绕os.statvfs()调用的包装器。我发现,与Linux中“du”的输出相比,它并没有给出我期望的答案 出于公司隐私的原因,我已经模糊了下面的一些路径,但是输出和代码在其他方面是未被修改的。我使用的是Python3.3.2 64位版本 #!/apps/python/3.3.2_64bit/bin/

各位好, 长期读者,第一次海报。希望我这里有所有的信息来提出一个有用的问题

我正在使用shutil.disk_usage()函数查找特定路径的当前磁盘使用量(可用量、使用量等)。据我所知,这是一个围绕os.statvfs()调用的包装器。我发现,与Linux中“du”的输出相比,它并没有给出我期望的答案

出于公司隐私的原因,我已经模糊了下面的一些路径,但是输出和代码在其他方面是未被修改的。我使用的是Python3.3.2 64位版本

#!/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))
哪些产出:

/data/foo/drivecode/me % disk_usage_test.py
Total: 609.60GB
Used:  291.58GB
Total: 609.60GB
Used:  291.58GB
正如您所看到的,主要问题是我希望“Used”的第二个数量要小得多,因为它是第一个目录的子集

/data/foo/drivecode/me % du -sh /data/foo/utils
2.0G    /data/foo/utils
尽管我非常信任“du”,但我发现很难相信Python模块也不正确。因此,可能问题出在我对Linux文件系统的理解上

我编写了一个模块(主要基于SO的某人代码),该模块递归地获取磁盘的使用情况,我一直使用到现在。它似乎与“du”输出相匹配,但比shutil.disk_usage()函数慢得多,所以我希望我能让它正常工作


非常感谢。问题是shutil使用下面的系统调用来确定所使用的空间。据我所知,这个系统调用没有文件路径粒度,只有文件系统粒度。这意味着,您为其提供的路径只帮助标识要查询的文件系统,而不是路径

换句话说,您给了它路径
/data/foo/utils
,然后它确定哪个文件系统支持此文件路径。然后它查询文件系统。当您考虑“<代码>使用< /Cult>参数是如何在SUUTIL中定义:

时,这一点就变得明显了。
used = (st.f_blocks - st.f_bfree) * st.f_frsize
其中:

fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
fsblkcnt_t     f_bfree;    /* # free blocks */
unsigned long  f_frsize;   /* fragment size */
这就是为什么它提供了整个文件系统上使用的总空间


实际上,在我看来,
du
命令本身也会遍历文件结构并将文件大小相加。这是GNU coreutils
du
命令。

shutil.disk\u usage返回磁盘使用情况(即支持路径的装入点),而不是该路径下的实际文件使用情况。它相当于运行
df/path/to/mount
,而不是
du/path/to/files
。请注意,对于这两个目录,您得到了完全相同的用法


从文档中:

对于2013年后遇到此问题的任何人更新:


根据您的Python版本和操作系统,
shutil.disk\u用法
可能支持
path
变量的文件和目录。以下是分类:

窗口:

  • 3.3-3.5:仅支持装入点/文件系统
  • 3.6-3.7:目录支持
  • 3.8+:文件和目录支持
Unix:

  • 3.3-3.5:仅支持装入点/文件系统
  • 3.6+:文件和目录支持

函数
shutil.disk\u usage
给出的是“磁盘”使用情况,而不是“目录”使用情况。您从中获得的信息应该与
df-h
进行比较,而不是与
du-sh
进行比较。谢谢。我想问题是,是否有一个Python函数更类似于路径下的文件使用?如果没有内置的,我可以使用os.walk()。这一切都解释了为什么“du”和Python等价物速度如此之快,也许目录结构已经包含了这些信息(我在这里猜测),它只是将其解析出来。然而,为了获得文件使用率,我需要对整个路径和子目录进行爬网,并将文件大小相加。事实上,除了手动计算每个文件所使用的空间量之外,没有其他方法来计算文件所使用的空间量。看看这些链接,它们可能会对您有所帮助:另外,请注意,您必须向上取整到块大小,才能获得与du提供的相同的数字: