使用python管道2个python脚本

时间:2015-07-20 06:11:05

标签: python pipe

我有3个python文件:1个用于接受字符串,1个用于反转它,1个用于管道它们。我对这个概念不熟悉,所以请帮助我如何实现这个目标。

1.py

def main():
    print 'Input Your String : '
    stri = raw_input()
    return stri

main()

2.py

import sys

if __name__=='__main__':
    for line in sys.stdin:
        sys.stdout.write(line[::-1])

pipe.py

import os

os.system('python 1.py | python 2.py')

我想要实现的是使用另一个python文件将1.py的输出提供给2.py。谢谢!

输出:

$ python pipe.py
foo

 : gnirtS ruoY tupnI[tecomp@localhost 3264]$ 

2 个答案:

答案 0 :(得分:0)

我部分能够使用subprocess模块使其工作。 python文件是 -

1.py - 在这里,您应该打印它而不是返回输入。

def main():
    print 'Input Your String : '
    stri = input()
    print stri

main()

2.py -

import sys

if __name__=='__main__':
    for line in sys.stdin:
        sys.stdout.write(line[::-1])

pipe.py -

import subprocess
import sys
p1 = subprocess.Popen(['python','1.py'] , stdout=subprocess.PIPE, stdin=sys.stdin)
output = p1.communicate()[0]

p2 = subprocess.Popen(['python','2.py'] , stdin=subprocess.PIPE, stdout=sys.stdout)
p2.communicate(output)[0]

在Pipe.py中,我们首先调用python 1.py,同时将stdin重定向到主脚本的stdin并将stdout重定向到PIPE,这样我们就可以得到output变量的输出

然后我们调用python 2.py,同时将其输出重定向到主脚本的标准输出并将其标准输出重定向到PIPE,然后使用p2.communicate()函数传入output变量作为输入。

结果是 -

>> python pipe.py
Blah

 : gnirtS ruoY tupnI
halB

请注意,它部分正常工作,因为我们没有看到来自1.py的提示。如果没有必要提示,我们也可以 -

1.py

def main():
    stri = input()
    print stri

main()

然后结果变成 -

>> python pipe.py
I inputted something

gnihtemos dettupni I

答案 1 :(得分:0)

问题是除了1.py中的print语句之外没有stdout,如果你在1.py中用print main()调用main()然后管道调用该脚本然后你的代码的进程的stdout可以使用pipe.py作为以下管道输出1.py到2.py:

from subprocess import PIPE, Popen, STDOUT

p = Popen(["python","1.py"], stdout=PIPE, stderr=STDOUT)
p.wait()
p2 = Popen(["python", "2.py"], stdin=p.stdout, stdout=PIPE, stderr=STDOUT)
p.stdout.close()
out, _ = p2.communicate()
print(out)

1.py:

def main():
    return raw_input('Input Your String : ')


if __name__ == "__main__":
    print main()

2.py:

import sys

if __name__=='__main__':
    for line in sys.stdin:
        sys.stdout.write(line[::-1])

或者使用带有check_output的shell = True:

from subprocess import check_output

out = check_output("python 1.py | python 2.py",shell=True)