|
不知道这是否是问这个问题的最佳地点,但是过去一周来我一直在Stack Exchange和其他论坛上查找,但仍然没有找到可行的解决方案。
我需要从python脚本中优雅地杀死bash脚本,到目前为止,我无法使其正常工作。
我在运行最新版本的RasPiOS和Python3的Raspberry Pi Zero W上运行此程序。
我在从init.d启动时自动运行python3脚本(它以root身份运行)。在那个python脚本中,我调用bash脚本也开始(它也以root身份运行)。
python脚本正在运行步进电机,bash脚本正在使用Pi摄像头运行timelapse系列。
目标是创建从日出到日落的全景间隔拍摄视频。我需要两个脚本并行运行,以便彼此独立地控制帧速率和平移速度。
我要完成的工作是:
在启动时,自动启动马达摇摄,然后启动相机拍照。
步进电机完成摇摄后,然后优雅地终止正在运行相机的bash脚本。(这就是我遇到的问题)
然后让电动机返回到其初始位置。
然后关闭Pi。
这是我正在使用的python脚本...请注意,我尝试用来杀死timelapse的2个(许多)解决方案已经删除.sh bash脚本已删除,因为我无法使它们都无法工作... python脚本结束后,timelapse.sh脚本仍在运行。我为这种草率而道歉,我是python编程的新手。- #!/usr/bin/python3
-
- from adafruit_motorkit import MotorKit
- from adafruit_motor import stepper
- from time import sleep
- import subprocess
- from subprocess import call
- #import psutil
- #import os, signal
-
- kit = MotorKit()
-
- # this starts the timelapse.sh script
- subprocess.Popen(['/bin/bash', './timelapse.sh'])
-
- #this is the slow east to west pan while pics are taken during timelapse using 5V 28BYJ-48 1:64 gear ratio stepper motor
- for j in range(22400):
- for i in range(1):
- kit.stepper1.onestep(direction=stepper.FORWARD, style=stepper.MICROSTEP)
- #set time between motor steps
- sleep(2.41) #timing for 270 degree (22400 steps) 15 hour pan with 16 microstepping
-
- # this kills the timelapse.sh script to stop taking pictures (didn't work)
- #PROCNAME = "timelapse.sh"
- #for proc in psutil.process_iter():
- # check whether the process name matches
- # if proc.name() == PROCNAME:
- # proc.kill()
-
- #this kills the timelapse.sh script to stop taking pictures (didn't work)
- #def check_kill_process(timelapse):
- # for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
- # fields = line.split()
- # pid = fields[0]
- # os.kill(int(pid), signal.SIGKILL)
-
- #this returns the stepper motor to starting position
- for i in range(1400):
- kit.stepper1.onestep(direction=stepper.BACKWARD, style=stepper.DOUBLE)
-
- #this shuts down the pi to wait for next reboot via the wittypi3 power controller
- call("sudo nohup shutdown -h now", shell=True)
复制代码 到目前为止,除了能够在树莓派关闭之前正常地杀死timelapse.sh脚本之外,我已经完成了所有工作。
我宁愿使用脚本名称来执行此操作,而不是尽可能使用它的PID#...只是为了简化操作?
任何帮助或建议,将不胜感激。就像我说的那样,我是python的新手,所以请您在回答和示例中都非常简洁。
谢谢你
本帖寻求最佳方案
蓝色月光2021-5-17 06:02发表回复被小白教程采纳,幸运的获得奖励 C币 5
在Linux上 详细答案»
|
|