使用call()执行cat,在python中使用管道和重定向输出

时间:2014-05-27 11:48:10

标签: python shell

我有这个shell命令:

cat input | python 1.py > outfile

input是一个值为

的文本文件
3
1
4
5

1.py是:

t = int(raw_input())

while t:
    n = int(raw_input())
    print n
    t -= 1

当我在终端输入它时,它会完美运行。

但是,当我使用以下代码从Python运行时:

from subprocess import call
script = "cat input | python 1.py > outfile".split()
call(script)

我明白了:

3
1
4
5

cat: |: No such file or directory
cat: python: No such file or directory
t = int(raw_input())

while t:
    n = int(raw_input())
    print n
    t -= 1
cat: >: No such file or directory
cat: outfile: No such file or directory

cat: |: No such file or directory
cat: python: No such file or directory
cat: >: No such file or directory
cat: outfile: No such file or directory

我如何做对吗?

2 个答案:

答案 0 :(得分:4)

默认情况下,call的参数直接执行,而不是传递给shell,因此不会处理管道和IO重定向。改为使用shell=True和单个字符串参数。

from subprocess import call
script = "cat input | python 1.py > outfile"
call(script, shell=True)

然而,让Python在不涉及shell的情况下处理重定向本身会更好。 (请注意,此处cat不是必需的;您可以改为使用python 1.py < input > outfile。)

from subprocess import call
script="python 1.py".split()
with open("input", "r") as input:
    with open("outfile", "w") as output:
        call(script, stdin=input, stdout=output)

答案 1 :(得分:1)

与将|>视为特殊重定向符号的shell不同,Python call()认为它们是正常的,并且传递给普通参数cat 。您可以考虑使用其他方法(如os.system

)通过shell调用命令
import os
os.system("cat input | python 1.py > outfile")

Running a command completely indepenently from script转发的答案。