Я пытаюсь запустить команду Linux strace -c ./client
в python с os.system()
. Когда я нажимаю ctrl+c
, я получаю некоторый вывод на терминал. Мне нужно отправить сигнал ctrl+c
программно через одну минуту и получить вывод терминала, который создается после нажатия ctrl+c
в файле. Псевдо сценарий будет действительно helpful.If я использую subprocess.Popen
, а затем отправить ctrl+c
сигнал с клавиатуры я не получил выход на терминале, поэтому придется использовать os.system
Отправить SIGINT в python в os.system
3
A
ответ
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"
0
Я бы порекомендовал модуль питона подпроцесс для выполнения команд 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
..
На ubuntu 14.04 x64, если я запускаю python 2.7.6, я получаю ошибку атрибута (у popen-объекта нет атрибута send_signal). Что с этим? – Epu