Отправить SIGINT в python в os.system

Я пытаюсь запустить команду Linux strace -c ./client в python с помощью os.system(). Когда я нажимаю ctrl+c, я получаю некоторый вывод на терминал. Мне нужно отправить сигнал ctrl+c программно через одну минуту и ​​мне нужен вывод терминала, который создается после нажатия ctrl+c в файле. Псевдо-скрипт будет очень полезен. Если я использую subprocess.Popen, а затем посылаю сигнал ctrl+c с клавиатуры, я не получаю вывод на терминал, поэтому должен использовать os.system


person user2591307    schedule 08.12.2014    source источник


Ответы (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
comment
В Ubuntu 14.04 x64, если я запускаю python 2.7.6, я получаю ошибку атрибута (объект popen не имеет атрибута send_signal). Что случилось с этим? - person Epu; 01.09.2015
comment
Должно быть process.send_signal(signal.CTRL_C_EVENT), сигнал.SIGINT поднять ValueError: Unsupported signal: 2. - person Ronen Ness; 01.07.2018
comment
@RonenNess CTRL_C_EVENT — это Windows, SIGINT — это Linux. Вопрос помечен как Linux, поэтому ответ правильный. - person c z; 28.08.2019