Отправить 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
..
Другие вопросы по тегам