You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:32:53