Расписание python перезапуска скрипта или повторного запуска объекта с новыми параметрами - PullRequest
5 голосов
/ 15 февраля 2020

У меня есть программа, которая будет работать круглосуточно, получая кадры с камеры, обрабатывая и отправляя .jpg изображения через локальную сеть. Как правило, я не хочу сохранять видео в файл, однако мне может потребоваться запланировать x минут сохранения в определенном случае (не по расписанию, по расписанию).

Я обрабатываю запись видео, вызывая VideoWriter как поток видеокамера. Я обнаружил, что это более точно, чтобы справиться с написанием с правильным 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), потому что ему нужны кадры с камеры. То же самое для потока. Я не уверен, что есть способ удалить камеру, не нарушая темы.

Идея решения проблемы

Я думал о способе

  1. Выполнить инициализацию video_camera без записи
  2. В данный момент полностью остановить main.py (или убить его, если это невозможно)
  3. Перезапустить main.py с новыми параметрами для video_camera
    • Это может включать сохранение файла cam_config, с которым у меня все в порядке
  4. , повторите 3) и 4) по необходимому расписанию

Места, которые я посмотрел за помощью

Я посмотрел здесь и здесь , но я не уверен, как все составить в плановом порядке.

1 Ответ

2 голосов
/ 23 февраля 2020

Вы можете использовать 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. (1-й вариант)


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())

2-й вариант:

Создать отдельные startup.sh и shutdown.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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...