【发布时间】:2020-07-20 03:24:18
【问题描述】:
我正在尝试制作一个 python 脚本,它可以自动将文件从我的内部驱动器移动到任何插入的 USB 驱动器。但是,这个目标路径是不可预测的,因为我不是每次都使用相同的 USB 驱动器。使用 Raspbian Buster 完整版,到目前为止我能做的最好的事情就是自动挂载到 /media/pi/xxxxx 中,其中 xxxxxx 部分是不可预测的。我正在尝试为此创建我的脚本帐户。我可以通过
获得驱动器安装点drives = os.listdir("/media/pi/")
但我担心有些会因为在被拉出之前没有被卸载而无效(我需要在没有显示器、键盘或 VNC 或任何用户输入的情况下运行此程序,而不是更换 USB 驱动器)。所以我认为我可能需要在 if elif elif elif 链中执行一系列 try catch 语句,以确保目的地确实有效,但我不知道如何在没有硬编码的情况下做到这一点中的名称。我知道如何遍历一组我不知道的名称的唯一方法是
for candidate_drive in drives:
但我不知道如何让它进入下一个候选驱动器,只有当当前驱动器抛出异常时。
系统:Raspberry Pi 4、Raspbian buster full、Python 3.7。
旁注:我也在 Buster lite w/usbmount 上尝试此操作,它确实具有可预测的安装名称,但我无法安装 exfat 和 ntfs,这是另一个帖子的问题。
更新:我在考虑这个问题,也许我需要一个 try, except, else 语句,其中 except 是 pas 而 else 是 break?我正在尝试。
更新 2:我重新考虑了我的问题,也许不是寻找异常来确定何时尝试下一个可能的驱动器,也许我可以寻找成功的传输并在成功的情况下中断循环。
import os
import shutil
files_to_send = os.listdir("/home/outgoing_files/")
source_path = "/home/outgoing_files/"
possible_USB_drives = os.listdir("/media/")
for a_possible_drive in possible_USB_drives:
try:
destpath = os.path.join("/media/", a_possible_drive)
for a_file in files_to_send:
shutil.copy(source_path + a_file, destpath)
except:
pass # transfer to possible drive didn't work
else:
break # Stops this entire program bc the transfer worked!
【问题讨论】:
-
我不熟悉您遇到的 USB 问题,但这听起来像是生成器功能可能会有所帮助。
-
我使用 else 块来打破 for 循环似乎有效。
标签: python linux usb shutil libusb