Python shutil 模块,disk_usage() 实例源码
我们从Python开源项目中,提取了以下27个代码示例,用于说明如何使用shutil.disk_usage()。
def _get_drive_usage(path):
"""
Use Python libraries to get drive space/usage statistics. Prior to v3.3, use `os.statvfs`;
on v3.3+, use the more accurate `shutil.disk_usage`.
"""
if sys.version_info >= (3, 3):
usage = shutil.disk_usage(path)
return {
"total": usage.total,
"used": usage.used,
"free": usage.free,
}
else:
# with os.statvfs, we need to multiple block sizes by block counts to get bytes
stats = os.statvfs(path)
total = stats.f_frsize * stats.f_blocks
free = stats.f_frsize * stats.f_bavail
return {
"total": total,
"free": free,
"used": total - free,
}
def check_folder(folder_to_check: str=Path.home().as_posix(),
check_space: int=1) -> bool:
"""Check working folder,from argument,for everything that can go wrong."""
folder = Path(str(folder_to_check))
m = "Folder {0} ({0!r}) free space {1} ({2} Bytes) of Minimum {3} GigaByte"
log.debug("Checking Working Folder: {0} ({0!r}).".format(folder))
if not folder.is_dir(): # What if folder not a folder.
log.critical("Folder does not exist: {0} ({0!r}).".format(folder))
return False
elif not os.access(folder.as_posix(), os.R_OK): # What if not Readable.
log.critical("Folder not readable: {0} ({0!r}).".format(folder))
return False
elif not os.access(folder.as_posix(), os.W_OK): # What if not Writable.
log.critical("Folder not writable: {0} ({0!r}).".format(folder))
return False
elif disk_usage and folder.exists() and bool(check_space):
hdd = int(disk_usage(folder.as_posix()).free)
if int(hdd / 1_024 / 1_024 / 1_024) >= int(check_space): # Check_space
log.info(m.format(folder, bytes2human(hdd), hdd, check_space))
return True
else: # < check_space Gb.
log.critical(m.format(folder, bytes2human(hdd), hdd, check_space))
return False
return False
def disk_size(self):
x = shutil.disk_usage('/')
return format(x.total / 1024 / 1024 / 1024, '.2f')
def free_space(self):
x = shutil.disk_usage('/')
return format(x.free / 1024 / 1024 / 1024, '.2f')
def used_space(self):
x = shutil.disk_usage('/')
return format(x.used / 1024 / 1024 / 1024, '.2f')
def _run_check(self, env):
path = env.root_dir
wait_time = min(env.delay, 5 * 60) # Check at least every 5 minutes
total_wait_time = env.delay
ran_callback = False
while True:
total, used, free = shutil.disk_usage(path)
byte2gib = 1.0 / 1024 / 1024 / 1024
byte2pct = 100.0 / total
logging.info('Disk usage on %s: %.2f GiB total, %.2f GiB used (%.2f%%), %.2f GiB free (%.2f%%)',
path, total * byte2gib, used * byte2gib, used * byte2pct, free * byte2gib, free * byte2pct)
free_percent = free * byte2pct
if not ran_callback and free_percent < env.warning:
logging.warning('Only %.2f%% free space on disk, trying diskfull hook', free_percent)
nimp.environment.execute_hook('diskfull', env)
ran_callback = True
continue
if free_percent >= env.warning:
break
if free_percent >= env.error:
logging.warning('Only %.2f%% free space on disk', free_percent)
break
if total_wait_time <= 0:
return False
logging.warning('Only %.2f%% free on disk, waiting for %d seconds',
free_percent, wait_time)
time.sleep(wait_time)
total_wait_time -= wait_time
return True
def test_disk_usage(self):
usage = psutil.disk_usage(os.getcwd())
assert usage.total > 0, usage
assert usage.used > 0, usage
assert usage.free > 0, usage
assert usage.total > usage.used, usage
assert usage.total > usage.free, usage
assert 0 <= usage.percent <= 100, usage.percent
if hasattr(shutil, 'disk_usage'):
# py >= 3.3, see: http://bugs.python.org/issue12442
shutil_usage = shutil.disk_usage(os.getcwd())
tolerance = 5 * 1024 * 1024 # 5MB
self.assertEqual(usage.total, shutil_usage.total)
self.assertAlmostEqual(usage.free, shutil_usage.free,
delta=tolerance)
self.assertAlmostEqual(usage.used, shutil_usage.used,
delta=tolerance)
# if path does not exist OSError ENOENT is expected across
# all platforms
fname = tempfile.mktemp()
try:
psutil.disk_usage(fname)
except OSError as err:
if err.args[0] != errno.ENOENT:
raise
else:
self.fail("OSError not raised")
def test_disk_usage_unicode(self):
# see: https://github.com/giampaolo/psutil/issues/416
safe_rmpath(TESTFN_UNICODE)
self.addCleanup(safe_rmpath, TESTFN_UNICODE)
os.mkdir(TESTFN_UNICODE)
psutil.disk_usage(TESTFN_UNICODE)
def disk_usage(self):
return self.loop.run_in_executor(
self._executor, shutil.disk_usage, self._config.path)
def get_free_space(self):
du = await self.disk_usage()
return du.free
def test_disk_usage(self):
usage = shutil.disk_usage(os.getcwd())
self.assertGreater(usage.total, 0)
self.assertGreater(usage.used, 0)
self.assertGreaterEqual(usage.free, 0)
self.assertGreaterEqual(usage.total, usage.used)
self.assertGreater(usage.total, usage.free)
def get_disk_free(path):
'''
@type path: str
@rtype tuple
'''
return (path, floor(float(shutil.disk_usage(path).free) / MB))
def test_disk_usage(self):
usage = shutil.disk_usage(os.getcwd())
self.assertGreater(usage.total, 0)
self.assertGreater(usage.used, 0)
self.assertGreaterEqual(usage.free, 0)
self.assertGreaterEqual(usage.total, usage.used)
self.assertGreater(usage.total, usage.free)
def test_module_all_attribute(self):
self.assertTrue(hasattr(shutil, '__all__'))
target_api = ['copyfileobj', 'copyfile', 'copymode', 'copystat',
'copy', 'copy2', 'copytree', 'move', 'rmtree', 'Error',
'SpecialFileError', 'ExecError', 'make_archive',
'get_archive_formats', 'register_archive_format',
'unregister_archive_format', 'get_unpack_formats',
'register_unpack_format', 'unregister_unpack_format',
'unpack_archive', 'ignore_patterns', 'chown', 'which',
'get_terminal_size', 'SameFileError']
if hasattr(os, 'statvfs') or os.name == 'nt':
target_api.append('disk_usage')
self.assertEqual(set(shutil.__all__), set(target_api))
def test_disk_usage(self):
usage = psutil.disk_usage(os.getcwd())
assert usage.total > 0, usage
assert usage.used > 0, usage
assert usage.free > 0, usage
assert usage.total > usage.used, usage
assert usage.total > usage.free, usage
assert 0 <= usage.percent <= 100, usage.percent
if hasattr(shutil, 'disk_usage'):
# py >= 3.3, see: http://bugs.python.org/issue12442
shutil_usage = shutil.disk_usage(os.getcwd())
tolerance = 5 * 1024 * 1024 # 5MB
self.assertEqual(usage.total, shutil_usage.total)
self.assertAlmostEqual(usage.free, shutil_usage.free,
delta=tolerance)
self.assertAlmostEqual(usage.used, shutil_usage.used,
delta=tolerance)
# if path does not exist OSError ENOENT is expected across
# all platforms
fname = tempfile.mktemp()
try:
psutil.disk_usage(fname)
except OSError as err:
if err.args[0] != errno.ENOENT:
raise
else:
self.fail("OSError not raised")
def test_disk_usage_unicode(self):
# see: https://github.com/giampaolo/psutil/issues/416
safe_rmpath(TESTFN_UNICODE)
self.addCleanup(safe_rmpath, TESTFN_UNICODE)
os.mkdir(TESTFN_UNICODE)
psutil.disk_usage(TESTFN_UNICODE)
def test_disk_usage(self):
usage = psutil.disk_usage(os.getcwd())
assert usage.total > 0, usage
assert usage.used > 0, usage
assert usage.free > 0, usage
assert usage.total > usage.used, usage
assert usage.total > usage.free, usage
assert 0 <= usage.percent <= 100, usage.percent
if hasattr(shutil, 'disk_usage'):
# py >= 3.3, see: http://bugs.python.org/issue12442
shutil_usage = shutil.disk_usage(os.getcwd())
tolerance = 5 * 1024 * 1024 # 5MB
self.assertEqual(usage.total, shutil_usage.total)
self.assertAlmostEqual(usage.free, shutil_usage.free,
delta=tolerance)
self.assertAlmostEqual(usage.used, shutil_usage.used,
delta=tolerance)
# if path does not exist OSError ENOENT is expected across
# all platforms
fname = tempfile.mktemp()
try:
psutil.disk_usage(fname)
except OSError as err:
if err.args[0] != errno.ENOENT:
raise
else:
self.fail("OSError not raised")
def test_disk_usage_unicode(self):
# see: https://github.com/giampaolo/psutil/issues/416
safe_rmpath(TESTFN_UNICODE)
self.addCleanup(safe_rmpath, TESTFN_UNICODE)
os.mkdir(TESTFN_UNICODE)
psutil.disk_usage(TESTFN_UNICODE)
def test_disk_usage(self):
usage = shutil.disk_usage(os.getcwd())
self.assertGreater(usage.total, 0)
self.assertGreater(usage.used, 0)
self.assertGreaterEqual(usage.free, 0)
self.assertGreaterEqual(usage.total, usage.used)
self.assertGreater(usage.total, usage.free)
def disk_usage(self, memoize=True) -> int:
"""Get the total disk usage of the directory and all of its contents.
Args:
memoize: Use cached data if available.
Returns:
The total disk usage of the directory in bytes.
"""
paths = self.scan_paths(memoize=memoize)
total_size = 0
for path, stat in paths.items():
total_size += stat.st_blocks * 512
return total_size
def space_avail(self) -> int:
"""Get the available space in the filesystem the directory is in.
Returns:
The amount of free space in bytes.
"""
return shutil.disk_usage(self.path).free
def discspace_info(self):
"""Save memory information about disc and card in list [total,used,free], use values to display levelbar and label element below"""
self.disc_space = [shutil.disk_usage(cli.stdir).total,
shutil.disk_usage(cli.stdir).used,
shutil.disk_usage(cli.stdir).free]
if cli.detectcard() is True:
self.card_space = [shutil.disk_usage(cli.cardpath).total,
shutil.disk_usage(cli.cardpath).used,
shutil.disk_usage(cli.cardpath).free,True]
else:
self.card_space = [1,0,0,False]
self.disc_bar = self.builder.get_object("level_wdir")
self.card_bar = self.builder.get_object("level_sd")
self.disc_bar.add_offset_value("lower",0.5)
self.disc_bar.add_offset_value("low",0.7)
self.disc_bar.add_offset_value("high",0.9)
self.card_bar.add_offset_value("lower",0.4)
self.card_bar.add_offset_value("low",0.7)
self.card_bar.add_offset_value("high",0.9)
self.disc_bar.set_value(self.disc_space[1]/self.disc_space[0])
self.card_bar.set_value(self.card_space[1]/self.card_space[0])
self.builder.get_object("free_wdir").set_text(_("free: {0} of {1}").format(self.sizeof_fmt(self.disc_space[2]),self.sizeof_fmt(self.disc_space[0])))
if self.card_space[3] is True:
self.builder.get_object("free_sd").set_text(_("free: {0} of {1}").format(self.sizeof_fmt(self.card_space[2]),self.sizeof_fmt(self.card_space[0])))
else:
self.builder.get_object("free_sd").set_text("")
#borrowed from http://stackoverflow.com/questions/1094841/reusable-library-to-get-human-readable-version-of-file-size
def freespace(self,src,dest):
"""Check for free disc space"""
if self.abs_size < shutil.disk_usage(dest).free:
return True
else:
self.needspace = app.sizeof_fmt(self.abs_size - shutil.disk_usage(dest).free)
return False
#Zielordner wählen, neuen oder bestehenden Ordner, Defaultwert yyyy-mm-dd
def get_drive_list():
"""
Gets a list of drives and metadata by parsing the output of `mount`, and adding additional info from various commands.
Disk size/usage comes from shutil.disk_usage or os.statvfs, and name/type info from dbus (Linux) or diskutil (OSX).
"""
if sys.platform == "darwin":
MOUNT_PARSER = OSX_MOUNT_PARSER
else:
MOUNT_PARSER = LINUX_MOUNT_PARSER
try:
drivelist = subprocess.Popen('mount', shell=True, stdout=subprocess.PIPE)
drivelisto, err = drivelist.communicate()
except OSError: # couldn't run `mount`, let's try reading the /etc/mounts listing directly
with open("/proc/mounts") as f:
drivelisto = f.read()
MOUNT_PARSER = RAW_MOUNT_PARSER
drives = []
for drivematch in MOUNT_PARSER.finditer(drivelisto.decode()):
drive = drivematch.groupdict()
path = drive["path"].replace("\\040", " ").replace("\\011", "\t").replace("\\012", "\n").replace("\\134", "\\")
# skip the drive if the filesystem or path is in a blacklist
if drive["filesystem"] in FILESYSTEM_BLACKLIST or any(path.startswith(p) for p in PATH_PREFIX_BLACKLIST):
logger.debug("Skipping blacklisted drive '{}'".format(path))
continue
# skip if we don't have read access to the drive
if not os.access(path, os.R_OK):
continue
# attempt to get some additional metadata about the drive
usage = _get_drive_usage(path)
dbus_drive_info = _try_to_get_drive_info_from_dbus(drive["device"])
diskutil_info = _try_to_get_drive_info_from_diskutil(drive["device"])
# combine the various metadata sources to construct the overall drive metadata
drives.append({
"path": path,
"name": dbus_drive_info.get("name") or diskutil_info.get("name") or path,
"filesystem": drive["filesystem"],
"freespace": usage["free"],
"totalspace": usage["total"],
"drivetype": dbus_drive_info.get("drivetype") or diskutil_info.get("drivetype") or "",
"guid": dbus_drive_info.get("guid") or diskutil_info.get("guid") or drive["device"],
})
return drives
def test_disk_partitions(self):
# all = False
ls = psutil.disk_partitions(all=False)
# on travis we get:
# self.assertEqual(p.cpu_affinity(), [n])
# AssertionError: Lists differ: [0, 1, 2, 3, 4, 5, 6, 7,... != [0]
self.assertTrue(ls, msg=ls)
for disk in ls:
if WINDOWS and 'cdrom' in disk.opts:
continue
if not POSIX:
assert os.path.exists(disk.device), disk
else:
# we cannot make any assumption about this, see:
# http://goo.gl/p9c43
disk.device
if SUNOS:
# on solaris apparently mount points can also be files
assert os.path.exists(disk.mountpoint), disk
else:
assert os.path.isdir(disk.mountpoint), disk
assert disk.fstype, disk
self.assertIsInstance(disk.opts, str)
# all = True
ls = psutil.disk_partitions(all=True)
self.assertTrue(ls, msg=ls)
for disk in psutil.disk_partitions(all=True):
if not WINDOWS:
try:
os.stat(disk.mountpoint)
except OSError as err:
if TRAVIS and OSX and err.errno == errno.EIO:
continue
# http://mail.python.org/pipermail/python-dev/
# 2012-June/120787.html
if err.errno not in (errno.EPERM, errno.EACCES):
raise
else:
if SUNOS:
# on solaris apparently mount points can also be files
assert os.path.exists(disk.mountpoint), disk
else:
assert os.path.isdir(disk.mountpoint), disk
self.assertIsInstance(disk.fstype, str)
self.assertIsInstance(disk.opts, str)
def find_mount_point(path):
path = os.path.abspath(path)
while not os.path.ismount(path):
path = os.path.dirname(path)
return path.lower()
mount = find_mount_point(__file__)
mounts = [x.mountpoint.lower() for x in
psutil.disk_partitions(all=True)]
self.assertIn(mount, mounts)
psutil.disk_usage(mount)
def test_disk_partitions(self):
# all = False
ls = psutil.disk_partitions(all=False)
# on travis we get:
# self.assertEqual(p.cpu_affinity(), [n])
# AssertionError: Lists differ: [0, 1, 2, 3, 4, 5, 6, 7,... != [0]
self.assertTrue(ls, msg=ls)
for disk in ls:
self.assertIsInstance(disk.device, (str, unicode))
self.assertIsInstance(disk.mountpoint, (str, unicode))
self.assertIsInstance(disk.fstype, (str, unicode))
self.assertIsInstance(disk.opts, (str, unicode))
if WINDOWS and 'cdrom' in disk.opts:
continue
if not POSIX:
assert os.path.exists(disk.device), disk
else:
# we cannot make any assumption about this, see:
# http://goo.gl/p9c43
disk.device
if SUNOS:
# on solaris apparently mount points can also be files
assert os.path.exists(disk.mountpoint), disk
else:
assert os.path.isdir(disk.mountpoint), disk
assert disk.fstype, disk
# all = True
ls = psutil.disk_partitions(all=True)
self.assertTrue(ls, msg=ls)
for disk in psutil.disk_partitions(all=True):
if not WINDOWS:
try:
os.stat(disk.mountpoint)
except OSError as err:
if TRAVIS and OSX and err.errno == errno.EIO:
continue
# http://mail.python.org/pipermail/python-dev/
# 2012-June/120787.html
if err.errno not in (errno.EPERM, errno.EACCES):
raise
else:
if SUNOS:
# on solaris apparently mount points can also be files
assert os.path.exists(disk.mountpoint), disk
else:
assert os.path.isdir(disk.mountpoint), disk
self.assertIsInstance(disk.fstype, str)
self.assertIsInstance(disk.opts, str)
def find_mount_point(path):
path = os.path.abspath(path)
while not os.path.ismount(path):
path = os.path.dirname(path)
return path.lower()
mount = find_mount_point(__file__)
mounts = [x.mountpoint.lower() for x in
psutil.disk_partitions(all=True)]
self.assertIn(mount, mounts)
psutil.disk_usage(mount)
def test_disk_partitions(self):
# all = False
ls = psutil.disk_partitions(all=False)
# on travis we get:
# self.assertEqual(p.cpu_affinity(), [n])
# AssertionError: Lists differ: [0, 1, 2, 3, 4, 5, 6, 7,... != [0]
self.assertTrue(ls, msg=ls)
for disk in ls:
self.assertIsInstance(disk.device, (str, unicode))
self.assertIsInstance(disk.mountpoint, (str, unicode))
self.assertIsInstance(disk.fstype, (str, unicode))
self.assertIsInstance(disk.opts, (str, unicode))
if WINDOWS and 'cdrom' in disk.opts:
continue
if not POSIX:
assert os.path.exists(disk.device), disk
else:
# we cannot make any assumption about this, see:
# http://goo.gl/p9c43
disk.device
if SUNOS:
# on solaris apparently mount points can also be files
assert os.path.exists(disk.mountpoint), disk
else:
assert os.path.isdir(disk.mountpoint), disk
assert disk.fstype, disk
# all = True
ls = psutil.disk_partitions(all=True)
self.assertTrue(ls, msg=ls)
for disk in psutil.disk_partitions(all=True):
if not WINDOWS:
try:
os.stat(disk.mountpoint)
except OSError as err:
if TRAVIS and OSX and err.errno == errno.EIO:
continue
# http://mail.python.org/pipermail/python-dev/
# 2012-June/120787.html
if err.errno not in (errno.EPERM, errno.EACCES):
raise
else:
if SUNOS:
# on solaris apparently mount points can also be files
assert os.path.exists(disk.mountpoint), disk
else:
assert os.path.isdir(disk.mountpoint), disk
self.assertIsInstance(disk.fstype, str)
self.assertIsInstance(disk.opts, str)
def find_mount_point(path):
path = os.path.abspath(path)
while not os.path.ismount(path):
path = os.path.dirname(path)
return path.lower()
mount = find_mount_point(__file__)
mounts = [x.mountpoint.lower() for x in
psutil.disk_partitions(all=True)]
self.assertIn(mount, mounts)
psutil.disk_usage(mount)