【问题标题】:Size of disk/partition in Python is different than linux commandPython中磁盘/分区的大小与linux命令不同
【发布时间】:2020-08-07 22:39:15
【问题描述】:

使用:Python 3.7.6,操作系统 Linux (rmp)

我需要在 Python 中提取磁盘和分区的总大小和可用大小。

我尝试了不同的 Python 函数来检索以字节为单位的块大小(结果相同)。 然后我比较了 Linux 命令的结果(也是以字节为单位),结果不同(Linux 命令不同于 Python)。

Python 函数:

  1. 使用 os.statvfs
import os 
statvfs  = os.statvfs('/dev/sda')     
statvfs.f_frsize *statvfs.f_blocks   
statvfs.f_frsize * statvfs.f_bfree

Results:
size of /dev/sda is 1973968896
size of /dev/sda1 is 1973968896 (the same??!)
  1. 使用 shutil.disk_usage
print(shutil.disk_usage('/dev/sda'))
usage(total=1973968896, used=0, free=1973968896)

print(shutil.disk_usage('/dev/sda1') )
usage(total=1973968896, used=0, free=1973968896)

我也试过psutil

import psutil
print(psutil.disk_usage('/dev/sda'))
print(psutil.disk_usage('/dev/sda1'))
same results as 1. and 2.

Linux 命令:

  1. blockdev --getsize64 #以字节为单位打印设备大小
blockdev --getsize64 /dev/sda
8001563222016

blockdev --getsize64 /dev/sda1
80014737408


  1. lsblk -b

我在这里想念什么? 为什么 Python 结果与 Linux 命令不同(而所有单位都以字节为单位)? 为什么 sda 和 sda1 的 Python 大小是一样的?

【问题讨论】:

    标签: python-3.x linux


    【解决方案1】:

    https://docs.python.org/3/library/shutil.html#shutil.disk_usagehttps://docs.python.org/3/library/os.html#os.statvfs 都用于获取文件系统而不是块设备的统计信息,因此当您使用 /dev/sda/dev/sda1 作为参数时 - 您实际上正在获取有关 /dev 的信息

    您可以使用stat 命令获得类似的结果,这是我的/dev/sdb 的示例。

    在python中:

    print(shutil.disk_usage('/dev/sdb'))                                                                                                                                                
    usage(total=8324083712, used=0, free=8324083712)
    
    print(shutil.disk_usage('/dev'))                                                                                                                                                
    usage(total=8324083712, used=0, free=8324083712)
    

    在外壳中:

    LANG=C stat -f /dev/sdb   
      File: "/dev/sdb"
        ID: 0        Namelen: 255     Type: tmpfs
    Block size: 4096       Fundamental block size: 4096
    Blocks: Total: 2032247    Free: 2032247    Available: 2032247
    Inodes: Total: 2032247    Free: 2031625
    
    LANG=C stat -f /dev/   
      File: "/dev/"
        ID: 0        Namelen: 255     Type: tmpfs
    Block size: 4096       Fundamental block size: 4096
    Blocks: Total: 2032247    Free: 2032247    Available: 2032247
    Inodes: Total: 2032247    Free: 2031625
    
    echo $(( 2032247 * 4096 ))
    8324083712
    

    可以看到shutil输出和block size * blocks total是完全一样的。

    注意 -f 标志:

    -f, --file-system display file system status instead of file status

    【讨论】:

    • 感谢您的解释!这是有道理的。你知道如何在 Python 中获取磁盘和分区的总大小和空闲大小吗?
    • @MariaB,有几个项目,作为 cli utils 的包装器,即 pypi.org/project/blkinfogithub.com/dcantrell/pyparted/blob/master/examples/… ,但我认为这有点超出当前问题的范围,你一定要发布另一个!如果您认为您的原始问题已得到解答 - 请随时接受它,以便其他人可以将其视为已解决。
    猜你喜欢
    • 2012-09-13
    • 2018-11-04
    • 2013-10-11
    • 2018-06-13
    • 2018-07-11
    • 2015-08-15
    • 2018-01-25
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多