使用Python将2个Python脚本进行管道传输

3
我有三个Python文件:一个用于接收字符串,一个用于反转字符串,一个用于将它们连接起来。我对这个概念还不熟悉,请帮助我实现这个功能。
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]$ 

执行 pipe.py 没有显示任何内容。终端会卡住一段时间。 - user4545837
你需要给一些值。在那上面键入 foo - Avinash Raj
编辑的内容 - user4545837
嗯,对我来说它似乎工作得很好。你可以看到它打印出了“gnirtS ruoY tupnI”。它不会打印出“oof”,因为1.py没有打印出raw_input的结果。 - tmr232
你实际想要什么输出,并且你为什么想要这样做? - Padraic Cunningham
显示剩余3条评论
2个回答

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,同时将其输出重定向到主脚本的 stdout,并将其 stdin 重定向到 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

0
问题在于1.py中除了您的print语句之外没有stdout,如果您在1.py中使用print main()调用main(),然后将调用该脚本的进程的stdout管道传递到2.py,则您的代码将正常工作,其中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)

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