Python: передача параметра в фоновый процесс - PullRequest
0 голосов
/ 16 декабря 2018

Я ищу лучшее решение для моей проблемы.

Мне нужно запустить скрипт Python, а затем, пока он работает (в фоновом режиме), мне нужно изменить значение внутри, когда пользователь захочет это сделать,Это может происходить до 20 раз в час или даже больше, но будут периоды времени, когда ничего не произойдет.Поэтому изменения должны быть максимально чистыми.

Я работаю над следующим фоном.У меня есть два сценария: стартовый и основной.Задача основного сценария - установить последовательное соединение и установить связь с внешним устройством, и этот процесс выполняется как nohup main.py & - после запуска он, вероятно, будет работать до перезагрузки.Задача стартового скрипта - просто запустить main, если нет дополнительного аргумента.Main работает в фоновом режиме, а стартер закрывается.

Если есть дополнительный аргумент, я хочу «соединиться» с уже запущенным main и отправить ему значение этого аргумента.В настоящее время я использую внешний файл «last.cfg» для обмена данными, но есть ли «лучшее» решение?Я читал о многопроцессорном модуле и использовании каналов, но я не смог приспособить это к своим потребностям.Возможно, я не видел чего-то важного.


Текущий пример захода на посадку (я обрезал ненужный код):

main.py

if __name__ == '__main__':
    while True:
        f = open("./desktop/last.cfg","r+")
        contents = f.readline()
        print(contents)

starter.py

import argparse
import subprocess
import re

parser = argparse.ArgumentParser()
parser.add_argument("val", nargs='?', default="null")
args = parser.parse_args()

if args.val == 'null':
    sub = subprocess.Popen("nohup ./desktop/main.py &", shell=True)
else:
    f = open("./desktop/last.cfg","r+")
    content = f.readline()
    p = re.compile('(val=)([0-9]*)')
    content = p.sub('\g<1>'+args.val,content)
    f.close()
    f = open("./desktop/last.cfg","w+")
    f.write(content)

1 Ответ

0 голосов
/ 16 декабря 2018

Итак, что вы в основном хотите, это способ изменить какое-то значение в запущенном скрипте Python извне.Я бы сказал, что ваш файловый подход - самый простой и лучший, и именно это все время использует обычное программное обеспечение (файлы конфигурации, которые при необходимости перезагружаются).Я не думаю, что вам нужно переходить к общей памяти, FIFO, сетевым сокетам или чему-либо еще, чтобы достичь того, что вам нужно.Простота окупается.

Могут быть простые улучшения вашего файлового подхода, которые сделают его совсем не плохим.Прежде всего, не читайте файл все время, но читайте его только при необходимости.Вы можете достичь этого, проверяя время изменения файла время от времени, используя stat ( документация ) и читая его, только если время изменения изменилось.Кроме того, вы можете сделать то же самое, что обычно делают демоны Linux: перечитать вашу конфигурацию после получения SIGHUP.Пример обработки сигнала здесь , вам, вероятно, понадобится SIGHUP, а не SIGALRM, как в примере.Чтобы отправить сигнал SIGHUP вашему процессу, используйте kill -HUP pid, где pid - это идентификатор процесса, как показано ps -a.

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