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 插入时 运行。无需使用常量 运行 程序来查找驱动器。
下面的脚本是 运行 在 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 插入时 运行。无需使用常量 运行 程序来查找驱动器。