使用Python子进程模块将输入传递给可执行文件

时间:2014-11-09 17:52:19

标签: bash python-2.7 subprocess

我有一个名为0.in的输入文件。要获得输出,我在Bash Shell中执行./a.out < 0.in

现在,我有几个这样的文件(超过500个),我想使用Python的子进程模块自动执行此过程。

我试过这样做:

data=subprocess.Popen(['./a.out','< 0.in'],stdout=subprocess.PIPE,stdin=subprocess.PIPE).communicate()

运行时没有打印任何内容(数据[0]为空白)。做我想做的事的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

使用<进行重定向是一个shell功能,而不是python功能。

有两种选择:

  1. 使用shell=True并让shell处理重定向:

    data = subprocess.Popen(['./a.out < 0.in'], stdout=subprocess.PIPE, shell=True).communicate()
    
  2. 让python处理重定向:

    with open('0.in') as f:
        data = subprocess.Popen(['./a.out'], stdout=subprocess.PIPE, stdin=f).communicate()
    
  3. 第二种选择通常是首选,因为它避免了外壳的变幻莫测。

    如果要在data中捕获stderr,请将stderr=subprocess.PIPE添加到Popen命令。否则,stderr将出现在终端上或发送python的错误消息的任何地方。