Запустить Repl/CLI в фоновом режиме и подать команды

Запустить Repl/CLI в фоновом режиме и подать команды

Допустим, pythonrepl запускается долго. Есть ли способ запустить его в фоновом режиме, чтобы я мог создать псевдоним и передать ему команды типа python-current "command to run".

решение1

В дистрибутиве Python нет ничего, что могло бы сделать этот тип открытия, несмотря на «батарейки включены».

Программы вроде редакторов могут справляться с такими вещами, потому что совершенно ясно, что делать при открытии другого файла: вы просто открываете окно/вкладку с новым файлом, обрабатываемым тем же исполняемым файлом.

Реализовать что-то подобное самостоятельно не так уж и сложно, но нужно подумать о том, что произойдет, когда первая команда еще не завершена, а вторая уже запланирована:

  • отменить первую команду
  • поставить в очередь вторую команду
  • запускать процессы параллельно (что требует дополнительного времени запуска, если только у вас нет нескольких потоков, ожидающих команду)

Я уведомил запущенные питоны о загрузке и выполнении модулей на основе файлов в каталоге, которые были просканированы, http-запрос (в системе на основе twisted) и с zeromq. Что подходит, зависит от того, что еще нужно системе, IMHO, я всегда выбираю то, что работает и имеет наименьшие накладные расходы. Вам python-currentпридется сделать правильный интерфейс.

Часто это совмещалось с перезагрузкой определенных модулей (чтобы получить обработку новых команд). Для этого можно использовать reload()встроенные:

import mycommand
# test for a command that requires reloading
reload(mycommand)


В качестве отступления: я нашел эту перезагрузку полезной, особенно при использовании кода пользовательского интерфейса. Загрузка исполняемого файла Python сравнима с Perl (0,002 с на моей системе, которой несколько лет time python -v). Загрузка базовых модулей занимает примерно в десять раз больше времени ( time python -c "exit();", 0.025s). But when using UI based programs the whole startup easily grows to several seconds and more. And in that case implementing dynamic command reading and having apython-current` имеет смысл.

решение2

Если вы используете, bashвы можете попробоватьсопроцессы. У Кш также естьсопроцессы, Я не уверен, что обе оболочки имеют эквивалентную функцию в этой области. Я пробовал только версию Ksh (мой работодатель любит klunk, поэтому мы использовали Ksh), и она работала, но было нелегко иметь больше одного сопроцесса.

Погуглите "ksh coprocess example" или "bash coprocess example", и вы найдете пример кода. Работайте по примерам, так как все это не очень интуитивно понятно.

Связанный контент