Как предотвратить вывод подпроцесса на стандартный вывод в Python? ⇐ Python
Как предотвратить вывод подпроцесса на стандартный вывод в Python?
Мне нужно запустить процесс с использованием Python, завершить его, а затем перезапустить, когда он зависнет. И я не хочу, чтобы второй процесс загрязнял стандартный вывод моей оболочки. Но что бы я ни делал, выходные данные подпроцесса записываются в оболочку. Кстати, я использую Linux.
Вот что у меня есть:
server_command = "./start.sh >/dev/null 2>&1" server_cwd = "/home/mehran/Project" процесс = subprocess.Popen(server_command, оболочка = Ложь, cwd=server_cwd, стандартный вывод = подпроцесс.DEVNULL, stderr=subprocess.DEVNULL) Как я уже упоминал, при этом выходные данные подпроцесса все равно будут выводиться в оболочку. Я также попробовал все другие комбинации, которые только мог придумать (без >/dev/null 2>&1, а затем без subprocess.DEVNULL)
[ОБНОВЛЕНИЕ]
Чтобы ответить на некоторые комментарии, я протестировал следующие случаи с одинаковыми результатами:
[*]shell=True [*][server_command] [*]stdin=subprocess.DEVNULL
Я добавил последний, хотя сценарий start.sh ничего не читает из стандартного ввода. Честно говоря, я не полностью прочитал сценарий, но, насколько я могу судить, он выполняет conda active . и запускает другую программу на Python. Дело в том, что я бы предпочел не трогать этот скрипт и подавлять вывод независимо от ситуации внутри этого скрипта.
[ОБНОВЛЕНИЕ]
Я забыл упомянуть об этом, когда запускал скрипт вручную в терминале следующим образом:
./start.sh >/dev/null 2>&1 Я не получаю нет вывода, что заставляет меня задуматься, почему тот же подход не работает при вызове из кода Python!
[ОБНОВЛЕНИЕ]
Если кто-то хочет повторить эту проблему, клонируйте следующий проект:
https://github.com/oobabooga/text-generation-webui
И затем запустите:
./start_linux.sh --api Это сценарий, которым я пытаюсь управлять в своем коде. Просто вам также нужно отправить HTTP-запрос для загрузки модели, чтобы увидеть упомянутый мной результат:
curl --request POST \ --url http://localhost:5000/api/v1/model \ --header 'Тип контента: приложение/json' \ --data '{"action": "load", "model_name": "TheBloke_WizardLM-1.0-Uncensored-CodeLlama-34B-AWQ"}' model_name относится к модели, которую вы загрузили в приложение. На самом деле это довольно просто.
Мне нужно запустить процесс с использованием Python, завершить его, а затем перезапустить, когда он зависнет. И я не хочу, чтобы второй процесс загрязнял стандартный вывод моей оболочки. Но что бы я ни делал, выходные данные подпроцесса записываются в оболочку. Кстати, я использую Linux.
Вот что у меня есть:
server_command = "./start.sh >/dev/null 2>&1" server_cwd = "/home/mehran/Project" процесс = subprocess.Popen(server_command, оболочка = Ложь, cwd=server_cwd, стандартный вывод = подпроцесс.DEVNULL, stderr=subprocess.DEVNULL) Как я уже упоминал, при этом выходные данные подпроцесса все равно будут выводиться в оболочку. Я также попробовал все другие комбинации, которые только мог придумать (без >/dev/null 2>&1, а затем без subprocess.DEVNULL)
[ОБНОВЛЕНИЕ]
Чтобы ответить на некоторые комментарии, я протестировал следующие случаи с одинаковыми результатами:
[*]shell=True [*][server_command] [*]stdin=subprocess.DEVNULL
Я добавил последний, хотя сценарий start.sh ничего не читает из стандартного ввода. Честно говоря, я не полностью прочитал сценарий, но, насколько я могу судить, он выполняет conda active . и запускает другую программу на Python. Дело в том, что я бы предпочел не трогать этот скрипт и подавлять вывод независимо от ситуации внутри этого скрипта.
[ОБНОВЛЕНИЕ]
Я забыл упомянуть об этом, когда запускал скрипт вручную в терминале следующим образом:
./start.sh >/dev/null 2>&1 Я не получаю нет вывода, что заставляет меня задуматься, почему тот же подход не работает при вызове из кода Python!
[ОБНОВЛЕНИЕ]
Если кто-то хочет повторить эту проблему, клонируйте следующий проект:
https://github.com/oobabooga/text-generation-webui
И затем запустите:
./start_linux.sh --api Это сценарий, которым я пытаюсь управлять в своем коде. Просто вам также нужно отправить HTTP-запрос для загрузки модели, чтобы увидеть упомянутый мной результат:
curl --request POST \ --url http://localhost:5000/api/v1/model \ --header 'Тип контента: приложение/json' \ --data '{"action": "load", "model_name": "TheBloke_WizardLM-1.0-Uncensored-CodeLlama-34B-AWQ"}' model_name относится к модели, которую вы загрузили в приложение. На самом деле это довольно просто.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение