在管道python脚本中进入交互模式

时间:2014-11-25 16:29:44

标签: python pipe

我正在尝试使用shell管道运算符“|”来管道2个python脚本,如下所示:

python s1.py | python s2.py

在最简单的情况下,s1.py和s2.py除了打印一些字符串外什么都不做:

在s1.py中:

print 'from s1.'

在s2.py中:

import sys
for line in sys.stdin.readlines():
    print 'from s2: '+line

我想在执行s2.py后进入交互模式。我试图将-i标志放在s1.py,s2.py和两者之前。但是没有一个能给出理想的结果。将import pdb;pdb.set_trace()放在s2.py的末尾也无济于事。

有人能给出一些线索吗? 顺便说一句,我的python版本是2.5.2

2 个答案:

答案 0 :(得分:1)

您需要重置stdin来自终端,而不是管道。也就是说,在要求用户输入之前(假设你是在Unix-y环境中),调用sys.stdin = open("/dev/tty")。例如:

import sys
for line in sys.stdin.readlines():
    print 'from s2: ' + line

sys.stdin = open("/dev/tty")

raw_input()

答案 1 :(得分:1)

根据jme和讨论的建议给出更明确的答案:

作为最小的工作示例,在s1.py中:

print "from s1.py"

在s2.py中:

import sys
import readline # optional, will allow Up/Down/History in the console
import code

red_out=not sys.stdout.isatty()   # check if re-directing out
red_in=not sys.stdin.isatty()   # chech if re-directed in

#------Print out the re-directed in messages------
if red_in:
    for line in sys.stdin.readlines():
        print line.strip()

#--- Enter interactive session if not re-directing out---
if not red_out:
    sys.stdin = open("/dev/tty")
    shell=code.InteractiveConsole(vars)
    shell.interact()

最后发布它,python s1.py | python s2.py