安排 python 脚本重新启动或使用新参数重新初始化对象



我有一个程序,它将24/7全天候运行,从相机获取帧,进行处理并通过本地网络发送.jpg图像。通常,我不希望将任何视频保存到文件,但是我可能希望在某些场合安排x分钟的保存(未触发,计划(。

我通过调用VideoWriter作为VideoCamera的线程来处理视频录制。我发现这更准确地处理正确的 fps 写入。当我想从头开始录制并且只想流式传输时,此过程非常有效。我像这样启动相机。

import ...
# from custom file import `VideoCamera` which has access to `VideoWriter`
from camera import VideoCamera
video_camera = VideoCamera(
flip = False, 
usePiCamera = False, 
resolution = (640, 480),
record = False,
record_duration = None,
record_timestamp = True
) 

相机无法初始化两次(无法访问同一相机两次(。所以我正在考虑安排停止并使用新参数(例如record = True, record_duration = "00:10:00"(重新启动。

我从控制台(python main.py(调用脚本,它具有:

if __name__ == '__main__':
t = threading.Thread(target=processing_fun, args=())
t.daemon = True
t.start()
print("To see feed connect to " + get_ip_address() + ":5000")
# to do, read ifconfig and assign IP using raspberry's IP
app.run(host='0.0.0.0', port = 5000, debug=False)

如果我这样做del(video_camera)processing_fun就会死,因为它需要相机的帧。流也是如此。我不确定有没有办法在不破坏线程的情况下删除相机。

解决问题的想法

我在想一种方法

  1. 在没有记录的情况下进行video_camera的初始化
  2. 在给定的时刻,干净地停止 main.py(如果不可能,则杀死它(
  3. 使用video_camera的新参数重新启动 main.py
    • 这可能涉及保存一个cam_config文件,我很好
  4. 按需要的时间表重复 3( 和 4(

我寻求帮助的地方

我看过这里和这里,但我不确定如何按计划的方式将事情放在一起。

您可以使用crontab来调度脚本,并且您提到也可以使用crontab杀死脚本。您可以创建一个startup.sh脚本和某种shutdown.sh来管理您的日程安排。

下面是一个示例:

你的python脚本说your_script.py

import ...
# from custom file import `VideoCamera` which has access to `VideoWriter`
from camera import VideoCamera
video_camera = VideoCamera(
flip = False, 
usePiCamera = False, 
resolution = (640, 480),
record = False,
record_duration = None,
record_timestamp = True
) 

first_arg = sys.argv[1]
second_arg = sys.argv[2]
third_arg = sys.argv[3]
# pass the above arguments here in the function
if __name__ == '__main__':
t = threading.Thread(target=processing_fun, args=())
t.daemon = True
t.start()
print("To see feed connect to " + get_ip_address() + ":5000")
# to do, read ifconfig and assign IP using raspberry's IP
app.run(host='0.0.0.0', port = 5000, debug=False)

用于调度 Python 脚本的 cron-python 脚本:

将此脚本命名为 schedule_cron_python.py 并调用此脚本来管理您的日程安排。 在这里,您可以将整个代码保存在一个函数中,也可以将参数传递给此 cron 脚本,例如您要调度的时间日期,然后使用另一个 cron 脚本对其进行管理。(第一个选项(


from crontab import CronTab
import os
import sys
cron = CronTab(user='sshuser')
job1 = cron.new(command="python3 your_script.py 'arg1' 'arg2' 'arg3'")
job1.hour.on(5) # Mention your own time here
job1.minute.on(30)
for item in cron:
print(item)
print(job1.enable())
cron.write()
#print(os.getcwd())

第二个选项:

创建单独的startup.shshutdown.sh

这些文件将只包含像nohup这样的命令,它只会调用你的脚本:

nohup python3 your_script.py

现在,您可以在 cron 脚本中调用这些.sh文件来管理您的计划。

from crontab import CronTab
import os
import sys
cron = CronTab(user='sshuser')
job1 = cron.new(command="sh startup.sh")
job1.hour.on(5) # Mention your own time here
job1.minute.on(30)
job2 = cron.new(command="sh shutdown.sh")
job1.hour.on(6) # Mention your own time here
job1.minute.on(30)
for item in cron:
print(item)
print(job1.enable())
cron.write()

参考此内容以获取有关 cron 的更多上下文和一些更有用的函数。 https://pypi.org/project/python-crontab/

最新更新