2015-07-20 4 views
3

У меня есть 3 файла python: 1 для принятия строки, один для ее изменения и один для их конвейера. Я новичок в этой концепции, поэтому, пожалуйста, помогите мне в том, как этого добиться.Piping 2 скрипта python с использованием 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') 

Все, что я хочу достичь кормится выход 1.py до 2. py, используя другой файл python. Благодаря !

Выход:

$ python pipe.py 
foo 

: gnirtS ruoY tupnI[[email protected] 3264]$ 
+0

любой ошибка или отслеживающие? –

+0

Выполнение pipe.py ничего не показывает. терминал висит в течение некоторого времени. –

+0

Вы дали какие-то значения? 'raw_input()' получит вход от самого пользователя. –

ответ

0

Проблема заключается в том, что не существует стандартный вывод, кроме вашего оператора печати в 1.py, если вы вызываете main() с помощью print main() в 1.py, тогда пропустите 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.р:

import sys 

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

Или с помощью оболочки = True с check_output:

from subprocess import check_output 

out = check_output("python 1.py | python 2.py",shell=True) 
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 в то время как перенаправлять его стандартного ввода стандартного ввода основного сценария и перенаправления stdout для PIPE, поэтому мы можем получить выход в переменной output.

Тогда мы называем, python 2.py в то время как redirectings его на стандартный вывод основного сценария и перенаправляет его стандартный ввод в 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