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

标签 python bash subprocess scheduled-tasks

我有一个程序可以 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)
processing_fun如果我这样做会死del(video_camera)因为它需要来自相机的帧。流也一样。我不确定有没有办法在不破坏线程的情况下删除相机。

解决问题的思路

我在想一种方法
  • video_camera 的初始化无记录
  • 在给定的时刻,干净地停止 main.py(如果不可能,则将其杀死)
  • 使用 video_camera 的新参数重新启动 main.py
  • 这可能涉及保存一个 cam_config 文件,我对
  • 没问题。
  • 按需要的时间表重复 3) 和 4)

  • 我寻求帮助的地方

    我看过herehere但我不确定如何以预定的方式将事情放在一起。

    最佳答案

    您可以使用 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)
    

    cron-python 脚本来安排你的 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
    

    现在你可以调用这些.sh cron 脚本中的文件来管理您的日程安排。
    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/

    关于python - 使用新参数安排python脚本重新启动或对象重新初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60234056/

    相关文章:

    linux - 合并输出中的相同行

    linux - 将变量传递给子 shell 时出现问题

    linux - python subprocess.run 如果你重新定向 stdout/stderr,它会错误退出而不是工作

    python - 与子流程交互

    python - 叠加两个 pandas Dataframes 或 numpy 数组并创建一个键值字典

    python - 避免 Python 代码 redux 中的代码重复

    python - 分层索引数据帧上的 GroupBy 转换

    python - 命名仅包含一个应用程序的 django 项目的好方法

    bash - 如何从 bash 脚本循环运行带参数的 curl 命令?

    python - 当我从作为 Linux 服务运行的 python 脚本调用它时,Popen 无法启动进程