python2.7偷看stdin

时间:2013-07-17 22:51:51

标签: python eclipse-plugin stdin peek

我想在不从stdin中删除任何内容的情况下调用sys.stdin.readlines()。我在Linux上使用Python2.7。

例如,我想要的是:

x = sys.stdin.readlines()
y = sys.stdin.readlines()

然后x和y具有相同的字符串。如果我能从stdin中读取并将内容放回去,那将是可以接受的。

背景:

我有一个模块,即EITHER将一个文件作为输入和一个-optional参数或“一些输入管道输入模块”和一个-optional参数

mymodule.py myfile -option
or
echo "some input" | mymodule.py -option

我有这个工作,它工作正常。我正在检查sys.stdin.isatty()以确定是否有任何输入管道输入。如果存在,如果命令行中有多个参数,模块将抛出错误(可能有一个-optional参数,但没有如果有stdin则指定的文件)

我遇到问题的原因是因为我需要在命令行上传递单元测试,但也需要在eclipse中传递。在命令行上一切正常,但看起来eclipse的PyUnit插件也使用sys.stdin

如果我调用sys.stdin.readlines(),则eclipse会放弃运行单元测试。另外,即使我没有指定任何参数,eclipse也会将事情推入sys.stdin,这使得很难确定是否存在有效参数。

在我看来,以某种方式获取sys.stdin.readlines()而不更改内容将是一个解决方案,但我不知道如何做到这一点。解决这个问题的任何答案都会令人满意。

可能重复:Peek into stream of Popen pipeline in Python

谢谢!

编辑:没有任何运气,比如......

foo = sys.stdin.readlines()
sys.stdin.write(foo)

编辑:删除了在tearDown中恢复stdin并将其放入测试函数中,但没有效果

1 个答案:

答案 0 :(得分:1)

从管道读取时,数据不再存在于管道中。你可以使用轮询机制来查看是否有任何数据要读取,但是你不能在不删除内容的情况下查看内容,至少在Linux上没有。

如果提供了文件,我会忽略stdin(即首先检查文件参数),如果没有提供文件作为参数,则验证stdin。