2014-12-08 5 views
3

Я пытаюсь запустить команду 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

ответ

2

В Python, можно программно послать сигнал с помощью Ctrl+Cos.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 
.. 
+0

На ubuntu 14.04 x64, если я запускаю python 2.7.6, я получаю ошибку атрибута (у popen-объекта нет атрибута send_signal). Что с этим? – Epu