интерфейс командной строки для фонового python процесса - PullRequest
0 голосов
/ 16 февраля 2020

Как мне создать интерфейс командной строки, который сохраняется как фоновый процесс и выполняет команды только при вводе указанных c команд? Обратите внимание, что в основном это псевдокод:

def startup():
   # costly startup that loads objects into memory once in a background process

def tear_down()
   # shut down; generally not needed, as main is acting like a service

def main():
    startup()

    # pseudo code that checks shell input for a match; after execution releases back to shell
    while True:
        usr_in = get_current_bash_command()
        if usr_in == "option a":
            # blocking action that release control back to shell when complete
        if usr_in == "option b":
            # something else with handling like option a
        if usr_in == "quit":
            # shuts down background process; will not be used frequently
            tear_down()
            break
   print("service has been shut down.  Bye!")

if __name__ == "__main__":
    # run non-blocking in background, only executing code if usr_in matches commands:
    main()

Обратите внимание, что это не так:

  • типичный пример argparse или click, который запускает (блокирует) python процесс пока все команды не будут выполнены
  • серия одноразовых сценариев для каждой команды; они используют объекты в памяти, созданные в фоновом процессе с помощью startup ()
  • совершенно другой оболочки, такой как ipython; Я хотел бы интегрировать это со стандартной оболочкой, например, bash.

Я знаком с click , argparse , подпроцесс , et c., И, насколько я могу судить, они принимают одну команду и блокируют до завершения. Я специально ищу что-то, что взаимодействует с фоновым процессом, чтобы дорогой запуск (загрузка объектов в память) обрабатывался только один раз. Я просмотрел пакеты python daemon и service , но я не уверен, что они также являются подходящим инструментом для работы.

Как я могу сообщник sh это? Мне кажется, что я не знаю, что гуглить, чтобы получить нужный мне ответ ...

1 Ответ

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

это только один способ сделать это ... (есть и другие способы, это довольно простой метод)

вы можете использовать сервер в качестве длительный процесс (затем вы превратите его в сервис, используя init systemV или upstart)

hardworker.py

import flask

app = flask.Flask("__main__")

@app.route("/command1")
def do_something():
    time.sleep(20)
    return json.dumps({"result":"OK"})

@app.route("/command2")
def do_something_else():
    time.sleep(26)
    return json.dumps({"result":"OK","reason":"Updated"})


if __name__ == "__main__":
   app.run(port=5000)

тогда ваш клиент может просто сделать http запросы против вашей "службы"

thin_client. sh

if [[ $1 == "command1" ]]; then
   curl http://localhost:5000/command1
else if [[ $1 == "command2" ]]; then
   curl http://localhost:5000/command2
fi;
...