在Python中,如何检查驱动器是否存在而不对可移动驱动器抛出错误?
这是我目前的情况:
import os.path as op
for d in map(chr, range(98, 123)): #drives b-z
if not op.isdir(d + ':/'): continue
问题是,在Windows系统中弹出了一个“No Disk”的错误框:
maya.exe - No Disk: 驱动器中没有磁盘。请在驱动器 \Device\Harddisk1\DR1 中插入一个磁盘 [取消, 再试一次, 继续]
我无法捕捉到这个异常,因为它实际上并没有抛出Python错误。
显然,这种情况只发生在可移动驱动器上,也就是说驱动器有一个字母分配,但没有插入任何磁盘。
有没有办法解决这个问题,而不需要在脚本中具体告诉它跳过哪些驱动器呢?
在我的情况下,我在学校的实验室里,驱动器字母会根据我使用的实验室电脑而变化。而且,我没有任何权限去访问磁盘管理。
7 个回答
4
如果你有 win32file 这个模块,你可以使用 GetLogicalDrives() 这个函数:
def does_drive_exist(letter):
import win32file
return (win32file.GetLogicalDrives() >> (ord(letter.upper()) - 65) & 1) != 0
6
这里有一种方法,可以在Windows和Linux上都能使用,适用于Python 2和Python 3:
import platform,os
def hasdrive(letter):
return "Windows" in platform.system() and os.system("vol %s: 2>nul>nul" % (letter)) == 0
9
使用 ctypes
这个包可以访问 GetLogicalDrives
这个函数。这样做不需要像 pywin32 这样的外部库,所以它是可以在不同环境中使用的,虽然操作起来稍微有点麻烦。例如:
import ctypes
import itertools
import os
import string
import platform
def get_available_drives():
if 'Windows' not in platform.system():
return []
drive_bitmask = ctypes.cdll.kernel32.GetLogicalDrives()
return list(itertools.compress(string.ascii_uppercase,
map(lambda x:ord(x) - ord('0'), bin(drive_bitmask)[:1:-1])))
itertools.compress
是在 Python 2.7 和 3.1 中新增的;如果你需要支持低于 2.7 或 3.1 的版本,这里有一个这个函数的实现:
def compress(data, selectors):
for d, s in zip(data, selectors):
if s:
yield d