【问题标题】:Python 2: Get network share path from drive letterPython 2:从驱动器号获取网络共享路径
【发布时间】:2017-12-11 17:56:18
【问题描述】:

如果我使用以下命令获取所有已连接驱动器的列表:

available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]

如何获取连接驱动器的 UNC 路径?

os.path 只返回z:\ 而不是\share\that\was\mapped\to\z

【问题讨论】:

  • 注意:我没有尝试执行这个。 docs.python.org/2/library/os.path.html 基于此,“注意在 Windows 上,其中许多函数不能正确支持 UNC 路径名。splitunc() 和 ismount() 可以正确处理它们”。 os.path.splitunc(path) 将路径名路径拆分成一对 (unc, rest) 以便 unc 是 UNC 挂载点(例如 r'\\host\mount'),如果存在的话,其余的路径(例如 r'\path\file.ext')。对于包含驱动器号的路径,unc 将始终为空字符串。
  • 自从我这样做以来已经有一段时间了,但是我发现 iirc 的方式是调用 net show (sp?) 并解析输出......附近没有任何 Windows 机器可以尝试现在...

标签: python python-2.7 unc network-share


【解决方案1】:

这里是如何在 python ≥ 3.4 中做到这一点,没有依赖关系!*

from pathlib import Path

def unc_drive(file_path):
    return str(Path(file_path).resolve())

*注意:我刚刚发现了这种方法失败的情况。我公司的一个网络共享具有权限设置,因此此方法会引发PermissionError。在这种情况下,win32wnet.WNetGetUniversalName 是一个合适的后备方案。

【讨论】:

    【解决方案2】:

    使用 pywin32 中的 win32wnet 转换驱动器号。例如:

    import win32wnet
    import sys
    
    print(win32wnet.WNetGetUniversalName(sys.argv[1], 1))
    

    当我运行它时,这给了我这样的东西:

    C:\test>python get_unc.py i:\some\path
    \\machine\test_share\some\path
    

    【讨论】:

    • 不处理本地驱动器,而是使用@njoosse的stackoverflow.com/a/45016081
    • 本地驱动器没有 UNC 名称。只有网络上的共享驱动器才会拥有它们。无论如何,我仍然建议使用 pywin32 而不是滚动您自己的 ctypes 访问 Windows,包括 timgolden.me.uk/pywin32-docs/…
    • 对不起,你完全正确。我在考虑这个错误,你当然可以抓住它。
    【解决方案3】:

    使用ctypes 和本文第一个答案中显示的代码:Get full computer name from a network drive letter in python,可以获得每个网络驱动器的驱动器路径,或者选择几个。

    如果驱动器不是网络驱动器,无论是本地驱动器还是可移动驱动器,给定的get_connection 函数将引发错误,这可以用

    # your drive list
    available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]
    for drive in available_drives:
        try:
            # function from linked post
            print(get_connection(drive))
        except WindowsError: # thrown from local drives
            print('{} is a local drive'.format(drive))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      相关资源
      最近更新 更多