Python: создать отдельный процесс и общаться с ним через командную строку - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу создать инструмент командной строки, который будет таймером обратного отсчета с некоторыми пользовательскими функциями, которые мне нужны.

Моя идея состоит в том, чтобы использовать скрипт на python для запуска процесса, который выполняет работу в фоновом режиме (например, воспроизводить звук, когда он близок к концу). После запуска процесса таймера я хотел бы связаться с ним через командную строку (отправить запросы, например, «оставшиеся» или команды, такие как «начало XXмин» и «остановка»). Конечно, должен быть только один экземпляр процесса таймера.

Использование может выглядеть как

>>> timer start 25min

>>> timer remaining
17:34 min remaining

>>> timer stop
timer stopped.

>>> timer start 90sec

Как должен выглядеть процесс таймера, чтобы выполнять свою работу, ожидая прибытия сообщений? Что, в свою очередь, нужно сделать сценарию интерфейса, чтобы запустить процесс и связаться с ним позже? Является ли использование отдельного процесса лучшей идеей для достижения моей цели?

Понятия не имею, как это сделать. Моя идея звучит очень просто, но почти все, что я обнаружил, касается параллелизма дочерних процессов родительского сценария, а это не то, что я хочу.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Здесь вы ищете базовую архитектуру клиент-сервер. Вам понадобятся две программы - одна, которая работает в фоновом режиме и прослушивает сообщения (сервер), а вторая - отправляет сообщения на сервер и что-то делает с ответами (клиент).

Есть много способов сделать это, и область законно сложна, так что не ждите, что это будет очень легко. Для начала я бы порекомендовал вам просто использовать простой http.server сервер с использованием стандартной библиотеки ( http server module ). Для клиентской части я бы порекомендовал библиотеку requests . HTTP - определенно не лучший выбор для локальной установки клиент-сервер, но с существующими библиотеками его будет намного легче запустить и запустить, и как только вы освоитесь с этим, вы можете рассмотреть другие подходы если хочешь.

0 голосов
/ 27 апреля 2018

Самый простой способ - использовать & в оболочке для выполнения вашего скрипта в фоновом режиме. А затем связывайтесь с процессом только с помощью сигналов USR1 и USR2.

В Python, я думаю, самый простой способ - использовать модуль демона.

import daemon

def do_something():
    pass

if __name__ == "__main__":
    with daemon.DaemonContext():
       do_something()

Или вы можете fork() свой собственный процесс демона.

import os

def doSomething():
    pass

def createDaemon():
    try:
        # Store the Fork PID
        pid = os.fork()

        if pid > 0:
            print 'PID: %d' % pid
            os._exit(0)

        os.chdir("/") 
        os.setsid() 
        os.umask(0) 
    except OSError, error:
        print 'Unable to fork. Error: %d (%s)' % (error.errno, error.strerror)
        os._exit(1)

    doSomething()

Тогда, например, вы можете использовать os.pipe для связи с этим процессом-демоном. В этом простом случае в системе * nix даже просто сигнализирует.

Другой вариант - использовать модуль multiprocessing для создания процесса демона, а также для связи с ним.

...