使用python检测U盘插拔事件

2024-01-09 10:58:04

在Windows系统中,可以使用Python来检测U盘的插拔事件。这通常是通过监听系统消息或者使用特定的API来实现的。以下是几种不同的方法来实现这一功能:

方法1:使用 pywin32 模块监听消息

pywin32 是一个Python扩展,提供了对Windows API的访问。你可以使用这个模块来监听设备变更消息。

import win32gui
import win32con
import win32api

def device_change(hwnd, msg, wParam, lParam):
    if msg == win32con.WM_DEVICECHANGE:
        if wParam == win32con.DBT_DEVICEARRIVAL:
            # U盘插入
            device_name = win32api.GetWindowsVolumeName(lParam)
            print(f"U盘 '{device_name}' 已插入")
        elif wParam == win32con.DBT_DEVICEREMOVECOMPLETE:
            # U盘拔出
            device_name = win32api.GetWindowsVolumeName(lParam)
            print(f"U盘 '{device_name}' 已拔出")
    return 0

# 注册回调函数
win32gui.PumpMessages()

方法2:使用 psutil 模块检测磁盘变化

psutil 是一个跨平台库,用于检索系统运行的详细信息。虽然它不直接提供U盘插拔事件的监听,但你可以通过定期检查磁盘列表来检测U盘的插入和移除。

import psutil
import time
def check_usb_drives():
    for partition in psutil.disk_partitions():
        # 检查分区是否是外部驱动器
        if partition.device.startswith('USB'):
            print(f"外部驱动器 '{partition.device}' 已插入")
        elif partition.device.startswith('SD'):
            print(f"外部驱动器 '{partition.device}' 已插入")
        # 你可以根据需要添加更多的条件来检测其他类型的外部设备

# 调用函数检查U盘
check_usb_drives()
# 可以使用循环来定期检查
# while True:
#     check_usb_drives()
#     time.sleep(1)

在这个例子中,我们通过检查 partition.device 属性的字符串是否以 ‘USB’ 或 ‘SD’ 开头来判断一个分区是否是外部驱动器。这是一个简单的方法,但并不完美,因为它可能会错过一些不遵循这些命名约定的新设备。为了更准确地检测外部设备,你可能需要使用更复杂的方法,比如检查设备的制造商信息或者使用其他的属性来判断。
请注意,psutil 模块可能不会在所有系统上提供相同的属性和方法。如果你遇到任何问题,请参考 psutil 的官方文档或源代码以获取更多信息。

方法3:使用 dbus 模块(适用于Linux)

在Linux系统中,可以使用dbus库来监听U盘的插拔事件。这通常涉及到使用udisks服务。

import dbus
import time
# 连接到dbus总线
bus = dbus.SessionBus()
# 监听udisks服务的变化
bus.add_signal_receiver(lambda *args: print("U盘已插入"), dbus_interface="org.freedesktop.udisks2", signal_name="VolumeInserted")
bus.add_signal_receiver(lambda *args: print("U盘已拔出"), dbus_interface="org.freedesktop.udisks2", signal_name="VolumeRemoved")
# 开始监听
main_loop = dbus.mainloop(DBusQtMainLoop=True)
main_loop.run()

请注意,这些代码片段仅提供了基本的插拔事件检测功能。在实际应用中,你可能需要处理更多的细节,例如错误处理、事件重复处理、U盘的挂载和卸载操作等。此外,根据你的具体需求和环境,可能需要调整代码以适应不同的操作系统版本或其他限制。

文章来源:https://blog.csdn.net/qq_42629529/article/details/135472667
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。