我有一个名为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]为空白)。做我想做的事的正确方法是什么?
答案 0 :(得分:2)
使用<
进行重定向是一个shell功能,而不是python功能。
有两种选择:
使用shell=True
并让shell处理重定向:
data = subprocess.Popen(['./a.out < 0.in'], stdout=subprocess.PIPE, shell=True).communicate()
让python处理重定向:
with open('0.in') as f:
data = subprocess.Popen(['./a.out'], stdout=subprocess.PIPE, stdin=f).communicate()
第二种选择通常是首选,因为它避免了外壳的变幻莫测。
如果要在data
中捕获stderr,请将stderr=subprocess.PIPE
添加到Popen
命令。否则,stderr将出现在终端上或发送python的错误消息的任何地方。