Python 脚本持续 运行(更好)

Python Script To Continually Run (Better)

下面的脚本是 运行 在 rasberry pi 上的脚本的工作原型,它的工作是在插入时从闪存驱动器上的指定文件夹中抓取文件。之后它通过电子邮件发送文件作为附件。现在,一切都很完美,但逻辑上并不符合我想要的方式。我有一个真正的 janky while True:循环使用 janky 睡眠定时器来延迟一些事情。理想情况下,我需要帮助开发一种方法,让所有这些在每个 USB 驱动器插入时只发生一次。然后它将进入“空闲模式”等待下一根棒。截至目前,如果没有我添加的睡眠定时器,它只会不断 运行 一遍又一遍。我一直在努力从逻辑上找出一种方法,让它按照我想要的方式工作。

提前致谢!

import smtplib, ssl
import shutil
import os
from time import sleep
from distutils import dir_util
from psutil import disk_partitions
from datetime import datetime
from datetime import date
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

now = datetime.now()
current_time = now.strftime("%H:%M:%S")

today = date.today()
day = today.strftime("%B %d, %Y")

def CopyFilesFromSD():
    try:
        dir_util.copy_tree(driver+'/REDACTED', '/home/pi/Desktop/Transferred Files')
        print("Files Succesfully Copied")
        if 'rw' in opts:
            with open(driver+'/Transfer_Log_REDACTED.txt', 'a', encoding = 'utf-8') as fp:
                fp.write("\nFiles Succesfully Transferred to REDACTED on " + day + " at " + current_time)
    except:
        print("Device unmounted during transfer process!")
    sleep(10)
    
def SendFiles():
    dir_path = "/home/pi/Desktop/Transferred Files/"
    files = os.listdir(dir_path)

    msg = MIMEMultipart()
    msg['To'] = "REDACTED"
    msg['From'] = "REDACTED"
    msg['Subject'] = "REDACTED"
    password = "REDACTED"

    body = MIMEText('Test.', 'html', 'utf-8')
    msg.attach(body)

    for f in files:
        file_path = os.path.join(dir_path, f)
        attachment = MIMEApplication(open(file_path, "rb").read(), _subtype="txt")
        attachment.add_header('Content-Disposition','attachment', filename=f)
        msg.attach(attachment)

    context = ssl.create_default_context()
    with smtplib.SMTP_SSL("REDACTED", 465, context=context) as server:
        server.login(msg['From'], password)
        server.sendmail(
            msg['From'], msg['To'], msg.as_string()
        )
    shutil.rmtree(dir_path, ignore_errors = False)
    sleep(5)

while True:
    sleep(1)
    for item in disk_partitions():
        if 'nodev' in item.opts:
            driver, opts = item.mountpoint, item.opts
            CopyFilesFromSD()
            SendFiles()
            break
        else:
            continue
        break

iScripters 在评论区的回答:

https://betterprogramming.pub/how-to-run-a-python-script-on-insertion-of-a-usb-device-2e86d38dcdb

这将允许 python 脚本仅在检测到 USB 插入时 运行。无需使用常量 运行 程序来查找驱动器。