使用 python 计算卷上剩余的跨平台空间

发布于 2024-07-05 17:44:37 字数 103 浏览 8 评论 0 原文

我需要一种方法来在 Linux、Windows 和 OS X 上使用 python 来确定磁盘卷上的剩余空间。我目前正在解析各种系统调用(df、dir)的输出来完成此操作 - 有更好的方法吗?

I need a way to determine the space remaining on a disk volume using python on linux, Windows and OS X. I'm currently parsing the output of the various system calls (df, dir) to accomplish this - is there a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

甜妞爱困 2024-07-12 17:44:37
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

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

Note that you must pass a directory name for GetDiskFreeSpaceEx() to work
(statvfs() works on both files and directories). You can get a directory name
from a file with os.path.dirname().

Also see the documentation for os.statvfs() and GetDiskFreeSpaceEx.

初心 2024-07-12 17:44:37

使用 pip install psutil 安装 psutil。 然后您可以使用以下命令获取可用空间量(以字节为单位):

import psutil
print(psutil.disk_usage(".").free)

Install psutil using pip install psutil. Then you can get the amount of free space in bytes using:

import psutil
print(psutil.disk_usage(".").free)
半山落雨半山空 2024-07-12 17:44:37

您可以使用 wmi 模块(适用于 windows)和 os.statvfs(适用于 unix)(

window )

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)

You could use the wmi module for windows and os.statvfs for unix

for window

import wmi

c = wmi.WMI ()
for d in c.Win32_LogicalDisk():
    print( d.Caption, d.FreeSpace, d.Size, d.DriveType)

for unix or linux

from os import statvfs

statvfs(path)
╰◇生如夏花灿烂 2024-07-12 17:44:37

如果您正在运行 python3:

使用 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)。

If you're running python3:

Using shutil.disk_usage()with os.path.realpath('/') name-regularization works:

from os import path
from shutil import disk_usage

print([i / 1000000 for i in disk_usage(path.realpath('/'))])

Or

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)

giving you the total, used, & free space in MB.

眼中杀气 2024-07-12 17:44:37

如果您不想添加其他依赖项,您可以在 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'

If you dont like to add another dependency you can for windows use ctypes to call the win32 function call directly.

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'
归属感 2024-07-12 17:44:37

一个好的跨平台方法是使用 psutil: http://pythonhosted.org/psutil/#disks
(请注意,您需要 psutil 0.3.0 或更高版本)。

A good cross-platform way is using psutil: http://pythonhosted.org/psutil/#disks
(Note that you'll need psutil 0.3.0 or above).

兔姬 2024-07-12 17:44:37

From Python 3.3 you can use shutil.disk_usage("/").free from standard library for both Windows and UNIX :)

無心 2024-07-12 17:44:37

您可以使用 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

You can use df as a cross-platform way. It is a part of GNU core utilities. These are the core utilities which are expected to exist on every operating system. However, they are not installed on Windows by default (Here, GetGnuWin32 comes in handy).

df is a command-line utility, therefore a wrapper required for scripting purposes.
For example:

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
掩耳倾听 2024-07-12 17:44:37

下面的代码在 Windows 上返回正确的值

import win32file    

def get_free_space(dirname):
    secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
    return secsPerClus * bytesPerSec * nFreeClus

Below code returns correct value on windows

import win32file    

def get_free_space(dirname):
    secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
    return secsPerClus * bytesPerSec * nFreeClus
墨小墨 2024-07-12 17:44:37

os.statvfs() 函数是获取该信息的更好方法类 Unix 平台(包括 OS X)。 Python 文档说“可用性:Unix”,但值得在您的 Python 构建中检查它是否也适用于 Windows(即文档可能不是最新的)。

否则,您可以使用 pywin32 库直接调用 GetDiskFreeSpaceEx 函数。

The os.statvfs() function is a better way to get that information for Unix-like platforms (including OS X). The Python documentation says "Availability: Unix" but it's worth checking whether it works on Windows too in your build of Python (ie. the docs might not be up to date).

Otherwise, you can use the pywin32 library to directly call the GetDiskFreeSpaceEx function.

只怪假的太真实 2024-07-12 17:44:37

我不知道有什么跨平台方法可以实现此目的,但也许对您来说一个好的解决方法是编写一个包装类来检查操作系统并为每个系统使用最佳方法。

对于 Windows,win32 中有 GetDiskFreeSpaceEx 方法扩展。

I Don't know of any cross-platform way to achieve this, but maybe a good workaround for you would be to write a wrapper class that checks the operating system and uses the best method for each.

For Windows, there's the GetDiskFreeSpaceEx method in the win32 extensions.

蓝颜夕 2024-07-12 17:44:37

以前的大多数答案都是正确的,我正在使用Python 3.10和shutil。
我的用例仅限于 Windows 和 C 驱动器(但您也应该能够为 Linux 和 Mac 扩展此功能(这里是 文档

以下是​​ Windows 的示例:

import shutil

total, used, free = shutil.disk_usage("C:/")

print("Total: %d GiB" % (total // (2**30)))
print("Used: %d GiB" % (used // (2**30)))
print("Free: %d GiB" % (free // (2**30)))

Most previous answers are correct, I'm using Python 3.10 and shutil.
My use case was Windows and C drive only ( but you should be able to extend this for you Linux and Mac as well (here is the documentation)

Here is the example for Windows:

import shutil

total, used, free = shutil.disk_usage("C:/")

print("Total: %d GiB" % (total // (2**30)))
print("Used: %d GiB" % (used // (2**30)))
print("Free: %d GiB" % (free // (2**30)))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文