簡體   English   中英

使用python管道2個python腳本

[英]Piping 2 python scripts using python

我有3個python文件: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]$ 

我部分能夠使用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

問題是除了1.py中的print語句之外沒有stdout,如果你在1.py中調用帶有print 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM