Открытие интерактивной оболочки Python после запуска скрипта Python в фоновом режиме

Команда linux «sdiff» показывает различия между сторонами -и -, по умолчанию включая все строки,но вы можете использовать различные опции, чтобы показать только различия:

sdiff -tWBs -w $COLUMNS config.xml config.xml.original

где

-t :перевод табуляции в пробелы

-W :игнорировать различия в пробелах

-B :игнорировать пустые строки

-s :игнорировать одинаковые строки

-w $COLUMNS :использовать всю ширину экрана

Показанные строки будут разделены символами |, < или > --см. документацию или просто попробуйте.

1
20.08.2019, 14:50
1 ответ

Это происходит из-за того, что интерпретатор Python в фоновом режиме «конкурирует» с командной строкой командной оболочки -, как только завершает выполнение программы test.py.

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

Один из способов решить эту проблему — добавить следующие строки в конец вашей программы на Python:

import os, signal  # access os-level functions and UNIX-signals
os.kill(os.getpid(), signal.SIGSTOP)  # send myself the UNIX SIGSTOP signal

(Конечно, importтакже можно разместить поверх вашей программы, как это обычно делается.)

Эта строка os.kill()переводит интерпретатор Python в остановленное состояние, точно так же, как это происходит, когда он пытается перейти в интерактивный режим в неподходящий момент. Только на этот раз он делает это сам, даже не пытаясь подсказать, чтобы не остаться в несогласованном состоянии.

Вы знаете, когда это os.kill()достигнуто, потому что оболочка строки команды -уведомляет вас об остановке Python. fg в этот момент возобновит Python, заставив его продолжить работу со строки os.kill(), тем самым начав свой собственный интерактивный сеанс.

Не используйте bgдля возобновления его работы после того, как он был остановлен этим os.kill(), потому что это заставит ядро ​​снова остановить Python только при попытке перейти в интерактивный режим в фоновом режиме.

1
28.01.2020, 00:03

Теги

Похожие вопросы