Я пытаюсь запустить команду Linux strace -c ./client
в python с помощью os.system()
. Когда я нажимаю ctrl+c
, я получаю некоторый вывод на терминал. Мне нужно отправить сигнал ctrl+c
программно через одну минуту и мне нужен вывод терминала, который создается после нажатия ctrl+c
в файле. Псевдо-скрипт будет очень полезен. Если я использую subprocess.Popen
, а затем посылаю сигнал ctrl+c
с клавиатуры, я не получаю вывод на терминал, поэтому должен использовать os.system
Отправить SIGINT в python в os.system
Ответы (2)
В Python вы можете программно отправить сигнал Ctrl+C
, используя os.kill. Проблема в том, что вам нужен pid
процесса, который получит сигнал, а os.system
ничего вам об этом не говорит. Вы должны использовать subprocess
для этого. Я не совсем понимаю, что вы сказали о неполучении вывода на терминал.
В любом случае, вот как вы можете это сделать:
import subprocess
import signal
import os
devnull = open('/dev/null', 'w')
p = subprocess.Popen(["./main"], stdout=devnull, shell=False)
# Get the process id
pid = p.pid
os.kill(pid, signal.SIGINT)
if not p.poll():
print "Process correctly halted"
person
José Tomás Tocino
schedule
08.12.2014
Я бы порекомендовал модуль subprocess python для запуска команд Linux. При этом сигнал SIGINT (эквивалент прерывания клавиатуры Ctrl-C) может быть программно отправлен команде с помощью функции Popen.send_signal(signal.SIGINT). Функция Popen.communicate() выдаст вам результат. Например
import subprocess
import signal
..
process = subprocess.Popen(..) # pass cmd and args to the function
..
process.send_signal(signal.SIGINT) # send Ctrl-C signal
..
stdout, stderr = process.communicate() # get command output and error
..
person
Asif Hasnain
schedule
24.07.2015
В Ubuntu 14.04 x64, если я запускаю python 2.7.6, я получаю ошибку атрибута (объект popen не имеет атрибута send_signal). Что случилось с этим?
- person Epu; 01.09.2015
Должно быть
process.send_signal(signal.CTRL_C_EVENT)
, сигнал.SIGINT поднять ValueError: Unsupported signal: 2
.
- person Ronen Ness; 01.07.2018
@RonenNess
CTRL_C_EVENT
— это Windows, SIGINT
— это Linux. Вопрос помечен как Linux, поэтому ответ правильный.
- person c z; 28.08.2019