Отправить SIGINT в Python для os.system
Я пытаюсь запустить команду Linux strace -c ./client
в питоне с os.system()
, Когда я нажимаю ctrl+c
Я получаю вывод на терминал. Я должен отправить ctrl+c
сигнализировать программно через одну минуту и хотеть вывод терминала, который производится после нажатия ctrl+c
в файле. Псевдо сценарий будет очень полезен. Если я использую subprocess.Popen
а затем отправить ctrl+c
сигнал с клавиатуры я не получил вывод на терминал, поэтому придется использовать 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"
Я бы порекомендовал подпроцессный модуль 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
..