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

3

我有一个用Python编写的脚本,它创建了一个线程,使用"subprocess"模块执行外部程序。现在,这个外部程序非常简单,从标准输入中取出一个数字并输出:

#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个回答

1
你假设你的Python标准输出是你的子进程标准输入,这是不正确的。查看subprocess文档:https://docs.python.org/2/library/subprocess.html。我认为在你的情况下,你可以使用popen,传递一个打开的文件对象作为stdin,将参数写入该文件对象,然后使用communicate获取结果。
我想补充一点,我怀疑这个过程对于你的需求来说过于复杂,但这个例子必须只是一个例子,所以很难说它真正过于复杂的程度。

我不理解这个popen是如何工作的。在我的情况下,我必须这样做吗?`>>> import shlex, subprocess
command_line = raw_input() . -input test.txt -output "out.txt" -cmd "a.out'" args = shlex.split(command_line) p = subprocess.Popen(args) ` 那么如何重定向stderr呢?
- Local Hero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接