我有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]$
答案 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)