如何用Python 3.x获取已挂载卷所使用的网络协议
在macOS的Python 3中检测挂载卷的协议(AFP/SMB)
由于Python标准库(如os、pathlib)没有直接提供获取挂载协议的API,在macOS上可以通过解析系统命令的输出来实现这个需求,以下是两种实用方法:
方法1:解析mount命令输出
macOS的mount命令会列出所有挂载点的详细信息,其中包含挂载协议类型(AFP对应afpfs,SMB对应smbfs)。通过Python调用该命令并解析输出,就能匹配目标路径的挂载协议:
import subprocess import os def get_mount_protocol(path): abs_path = os.path.abspath(path) # 执行mount命令获取所有挂载信息 mount_result = subprocess.run(['mount'], capture_output=True, text=True) if mount_result.returncode != 0: raise RuntimeError("无法获取系统挂载信息") # 逐行解析输出内容 for line in mount_result.stdout.splitlines(): parts = line.split() # 匹配目标路径对应的挂载行 if len(parts) >= 3 and parts[2] == abs_path: # 提取括号内的第一个字段,即协议类型 protocol = parts[3].strip('()').split(',')[0] return protocol return None # 调用示例 target_volume = "/Volumes/YourAFPVolume" protocol = get_mount_protocol(target_volume) if protocol == "afpfs": print("符合要求:该卷以AFP协议挂载") elif protocol == "smbfs": print("不符合要求:该卷以SMB协议挂载") else: print(f"无法识别协议或路径未挂载:{protocol}")
方法2:使用diskutil info命令(更精准)
如果目标路径是挂载卷的根目录,或者需要更明确的协议名称(直接显示AFP/SMB),可以通过diskutil info命令获取更详细的挂载属性:
import subprocess import os def get_mount_protocol_diskutil(path): abs_path = os.path.abspath(path) # 先通过df命令找到目标路径对应的挂载点 df_result = subprocess.run(['df', abs_path], capture_output=True, text=True) if df_result.returncode != 0: raise RuntimeError("无法获取磁盘挂载信息") df_lines = df_result.stdout.splitlines() if len(df_lines) < 2: return None # 提取挂载点路径(df输出的最后一列) mount_point = df_lines[1].split()[-1] # 调用diskutil info获取挂载点的详细属性 diskutil_result = subprocess.run(['diskutil', 'info', mount_point], capture_output=True, text=True) if diskutil_result.returncode != 0: raise RuntimeError("无法获取磁盘详细信息") # 查找Network Protocol字段 for line in diskutil_result.stdout.splitlines(): if "Network Protocol:" in line: return line.split(':', 1)[1].strip() return None # 调用示例 target_volume = "/Volumes/YourAFPVolume" protocol = get_mount_protocol_diskutil(target_volume) if protocol == "AFP": print("符合要求:该卷以AFP协议挂载") elif protocol == "SMB": print("不符合要求:该卷以SMB协议挂载") else: print(f"无法识别协议或路径未挂载:{protocol}")
注意事项
- 两种方法都不需要root权限,普通用户权限即可执行
mount和diskutil命令。 - 若目标路径是卷内的子目录,方法1会自动匹配到对应卷的挂载点;方法2会先通过
df找到卷的根挂载点再查询。 - 可以先手动执行
mount或diskutil info /Volumes/YourVolume命令,确认输出中的协议字段,方便调试。
内容的提问来源于stack exchange,提问作者Dude
相关产品推荐
相关产品推荐

