Python:在 Windows 或 Linux 上获取挂载点

Posted

技术标签:

【中文标题】Python:在 Windows 或 Linux 上获取挂载点【英文标题】:Python: Get Mount Point on Windows or Linux 【发布时间】:2010-11-11 10:09:21 【问题描述】:

我需要一个函数来确定一个目录是否是驱动器的挂载点。 我发现这段代码已经适用于 linux:

def getmount(path):
  path = os.path.abspath(path)
  while path != os.path.sep:
    if os.path.ismount(path):
      return path
    path = os.path.abspath(os.path.join(path, os.pardir))
  return path

但我不确定如何让它在 Windows 上运行。我可以假设挂载点是驱动器号(例如 C:) 吗?我相信可以在 Windows 上进行网络挂载,因此我也希望能够检测到该挂载。

【问题讨论】:

可以将驱动器安装到 Windows 中驱动器内的路径。我想您必须查看 pywin32 才能更好地了解如何执行此操作。 【参考方案1】:

Windows 过去没有将它们称为“挂载点”[edit:现在可以了,见下文!],您可以为它们找到的两种典型/传统语法是驱动器信,例如Z:,或者 \\hostname(带有两个前导反斜杠:小心转义或在 Python fpr 这样的文字字符串中使用 r'...' 表示法)。

编辑:由于支持 NTFS 5.0 挂载点,但根据 this post 的说法,它们的 API 处于相当状态——“损坏且文档不完整”,帖子的标题说。也许执行微软提供的mountvol.exe 是最不痛苦的方式——mountvol drive:path /L 应该发出指定路径的挂载卷名,或者只是mountvol 这样列出所有这样的挂载(我不得不说“应该”,因为我现在无法检查)。您可以使用subprocess.Popen 执行它并检查其输出。

【讨论】:

也有可能将卷安装在另一个驱动器中(尽管我不确定这是否是正确的术语)。【参考方案2】:

您要查找挂载点还是只是确定它是否是挂载点?

无论如何,如上所述,在 WinXP 中可以将逻辑驱动器映射到文件夹。

详情请看这里:http://www.modzone.dk/forums/showthread.php?threadid=278

我会尝试 win32api.GetVolumeInformation

>>> import win32api
>>> win32api.GetVolumeInformation("C:\\")
    ('LABEL', 1280075370, 255, 459007, 'NTFS')
>>> win32api.GetVolumeInformation("D:\\")
    ('CD LABEL', 2137801086, 110, 524293, 'CDFS')
>>> win32api.GetVolumeInformation("C:\\TEST\\") # same as D:
    ('CD LABEL', 2137801086, 110, 524293, 'CDFS')
>>> win32api.GetVolumeInformation("\\\\servername\\share\\")
    ('LABEL', -994499922, 255, 11, 'NTFS')
>>> win32api.GetVolumeInformation("C:\\WINDOWS\\") # not a mount point
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    pywintypes.error: (144, 'GetVolumeInformation', 'The directory is not a subdirectory of the root directory.')

【讨论】:

请注意,win32api 来自单独安装的软件包sourceforge.net/projects/pywin32/files 感谢您的回答——这也让我发现了如何获取 DVD 磁盘光盘【参考方案3】:

这里有一些代码可以返回驱动器号指向的 UNC 路径。我想有一种更巧妙的方法可以做到这一点,但我想我会贡献我的一小部分。

import sys,os,string,re,win32file
for ch in string.uppercase:  # use all uppercase letters, one at a time
    dl = ch + ":"
    try:
        flds = win32file.QueryDosDevice(dl).split("\x00")
    except:
        continue
    if re.search('^\\\\Device\\\\LanmanRedirector\\\\',flds[0]):
        flds2 = flds[0].split(":")
    st = flds2[1]
    n = st.find("\\")
    path = st[n:] 
        print(path)

【讨论】:

以上是关于Python:在 Windows 或 Linux 上获取挂载点的主要内容,如果未能解决你的问题,请参考以下文章

在非 Windows 平台(Linux 或 Mac)上使用 Python 中的 Access 数据库

在非 Windows 平台(Linux 或 Mac)上使用 Python 中的 Access 数据库

在 Linux 中从 Java 或 Python 访问扫描器(或者其他的,如果它有技术动机的话)(但 Windows 会很好)

在 python 中,如何将 1 个或多个文件作为具有绝对路径的参数拖放到我的脚本中? (适用于 windows、linux 和 mac)

python之window编译脚本在Linux执行

常见问题:Linux安装Python3步骤Windows无法利用pip