将stdin输入重定向到python中的线程进程的文件

时间:2015-05-08 17:56:04

标签: python multithreading

我在python中有一个脚本,它创建一个使用“subprocess”模块执行外部程序的线程。现在,这个外部程序非常简单,从stdin中取一个数字并打印:

#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])

问题是文件的输入被忽略,输出如下:

[vbruscin@lxplus0044 python]$ python filtro.py ./a.out test.txt
1

2

3
Inserisci numero: [vbruscin@lxplus0044 python]$ caso default

有什么问题?感谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

你假设你的python的stdout是你的子进程&#39; stdin,这不是真的。查看子进程的文档:https://docs.python.org/2/library/subprocess.html。我相信你的情况你可以使用popen,为stdin传递一个打开的文件对象,将你的参数写入该文件对象,然后使用communication来获得结果。

我补充一点,我怀疑这个过程对于你需要的东西而言过于复杂,但这个例子只能是一个例子,所以很难说它真正的程度过于复杂。