python - والهكر - مقدمة في البايثون




مساحة مشتركة بين المنصات متبقية على وحدة التخزين باستخدام python (8)

أحتاج إلى طريقة لتحديد المساحة المتبقية على وحدة تخزين القرص باستخدام python على نظام التشغيل Linux و Windows و OS X. أنا الآن بصدد تحليل مخرجات مكالمات النظام المختلفة (df، dir) لإنجاز هذا - هل هناك طريقة أفضل؟


إذا كنت تشغل 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)

مما يتيح لك المساحة الإجمالية والمستعملة والمجانية في ميغابايت.


أدناه رمز إرجاع القيمة الصحيحة على النوافذ

import win32file    

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

تثبيت psutil باستخدام psutil تثبيت pip install psutil . بعد ذلك ، يمكنك الحصول على مقدار المساحة الحرة بالبايت باستخدام:

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

تعد وظيفة os.statvfs() طريقة أفضل للحصول على هذه المعلومات لمنصات Unix-like (بما في ذلك OS X). تقول وثائق Python "Availability: Unix" ولكن الأمر يستحق التحقق مما إذا كان يعمل على Windows أيضًا في بناء Python (أي أن المستندات قد لا تكون حديثة).

خلاف ذلك ، يمكنك استخدام مكتبة pywin32 للاتصال مباشرة الدالة GetDiskFreeSpaceEx .


لا أعرف أي طريقة عبر النظام الأساسي لتحقيق ذلك ، ولكن ربما يكون الحل المناسب لك هو كتابة فئة ملحقة تتحقق من نظام التشغيل وتستخدم أفضل طريقة لكل منهما.

بالنسبة لنظام التشغيل Windows ، يوجد أسلوب GetDiskFreeSpaceEx في ملحقات win32.


من Python 3.3 يمكنك استخدام shutil.disk_usage("/").free من المكتبة القياسية لكل من Windows و UNIX :)


يمكنك استخدام وحدة wmi للنوافذ و os.statvfs لـ unix

للنافذة

import wmi

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

لليونيكس أو لينكس

from os import statvfs

statvfs(path)

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 .





diskspace