总的来说,我正在为一个博物馆项目进行工作,以提供更具交互性的壁画展示。我有一个Raspberry Pi 3 Model B +,它的激光二极管和一个按钮一起安装在Adafruit平移-倾斜套件(https://www.adafruit.com/product/1967)上。我正在编写一个Python脚本,按一下该按钮即可播放音频文件,并按顺序排列,使激光移动并根据需要打开/关闭。
因此,我有一些代码,将在按下按钮时运行音频和激光序列,当序列结束时,可以使用按钮进行重放。挑战在于,如果在序列结束之前按下按钮,我希望能够中断并重新启动该序列。到目前为止,我发现的最佳方法是使用Python多处理库来开始()和终止()控制激光和伺服器的顺序。当我有从命令行运行时可以正常工作的代码时(可以在运行时按按钮以启动脚本并重新启动整个演示文稿),而当我在启动时从rc.local运行相同的代码时,中断每次按下按钮都会打开新流程(引入许多并行序列),因此行为完全丧失。
我的大问题是,从终端启动Python脚本和通过rc.local在启动时启动Python脚本时,多处理库的工作方式有何不同? Python脚本不再像从命令行运行脚本那样管理进程吗?另外,还有更好的方法来中断Python函数吗?
当前,我有一个名为threaded_sequence()的函数,该函数保存激光序列,并且以下代码用于管理中断(仅在第一次运行之后):
# set up initial thread and define variable to say whether this is the first run
thread = multiprocessing.Process(target = threaded_sequence)
first_run = True
while True:
# check button status
start_button_state = GPIO.input(GPIO_START_BUTTON)
try:
if start_button_state == True: # capture button press
# reset audio if necessary
audio.stop()
# check that laser is off at start
GPIO.output(GPIO_LASER, 0)
# start audio
audio.play()
## sequence for laser and servos
# if this is not the first run, kill thread and open new one
if not first_run:
thread.terminate()
thread = multiprocessing.Process(target = threaded_sequence)
# open thread to run laser/servo sequence
thread.start()
# set variable to False as this can no longer be the first run
first_run = False
# pause for next sequence
time.sleep(0.1)