2015-05-08 3 views
3

У меня есть скрипт на python, который создает поток, который выполняет внешнюю программу с модулем «subprocess». Теперь, эта внешняя программа очень проста, возьмите номер из стандартного ввода и печати:Перенаправить ввод stdin в файл для процесса потока в python

#include <stdio.h> 

main(){ 
    int numero; 

    printf("Inserisci numero: "); 
    scanf("%d",&numero); 

    switch(numero){ 
    case 1: 
     printf("uno\n"); 
     break; 
    case 2: 
     printf("due\n"); 
     break; 
    default: 
     printf("caso default\n"); 
    } 

} 

Теперь, я написал скрипт в Python, которые принимают входные данные из текстового файла; скрипт работает в режиме наблюдения:

python filtro.py ./a.out test.txt 

и сценарий является продолжением:

import sys 
import subprocess 
import threading 
import fileinput 

class Filtro: 
    #Costruttore 
    def __init__(self,cmd): 
    #Funzione di esecuzione thread 
    def exec_cmd(): 
     try: 
      subprocess.check_call(cmd, shell=True) 
     except subprocess.CalledProcessError: 
      print "Il comando", cmd, "non esiste. Riprovare." 


    #Generazione thread demone 
    self.thr=threading.Thread(name="Demone_cmd",target=exec_cmd) 
    self.thr.setDaemon(True) 
    self.thr.start() 

    def inp(self,txt): 
    for line in fileinput.input(txt): 
     print line 

filtro=Filtro(sys.argv[1]) 
filtro.inp(sys.argv[2]) 

Беда в том, что ввод из файла игнорируется, и выход заключается в следующем:

[[email protected] python]$ python filtro.py ./a.out test.txt 
1 

2 

3 
Inserisci numero: [[email protected] python]$ caso default 

В чем проблема? Спасибо всем за помощь.

ответ

1

Вы считаете, что ваш stdout вашего python является вашим подпроцессом 'stdin, что не так. Проверьте документацию для подпроцесса: https://docs.python.org/2/library/subprocess.html. Я считаю, что для вашей ситуации вы можете использовать popen, передавая открытый файл для stdin, записывая свои аргументы в этот файловый объект, а затем используйте связь для получения результата.

Я добавлю, что я подозреваю, что этот процесс слишком сложный для вас, но пример должен быть только примером, поэтому трудно сказать, насколько это действительно сложно.

+0

Я не понимаю, как это работает. В моем случае, Должен ли я сделать это? '>>> import shlex, подпроцесс >>> command_line = raw_input() . -input test.txt -output "out.txt" -cmd "a.out '" >>> args = shlex.split (command_line) >>> p = subprocess.Popen (args) ' И для перенаправления STDERR? –

Смежные вопросы