判断一个Python程序是否有从stdin读取的内容的最佳方法是什么?

时间:2009-03-30 22:58:26

标签: python

如果像这样执行,我希望程序做一件事:

cat something | my_program.py

如果按照这样的方式做另外的事情

my_program.py

但是如果我从stdin读取,那么它将等待用户输入,所以我想在尝试从stdin读取之前看看是否有任何东西要读。

4 个答案:

答案 0 :(得分:61)

如果您想检测是否有人将数据传输到您的程序中,或者以交互方式运行它,您可以使用isatty来查看stdin是否是终端:

$ python -c 'import sys; print sys.stdin.isatty()'
True
$ echo | python -c 'import sys; print sys.stdin.isatty()'
False

答案 1 :(得分:8)

你想要选择模块(unix上的man select)它将允许你测试stdin上是否有任何可读的东西。请注意,select不适用于带有文件对象的Window。但是从你管道问题的问题我假设你是基于unix的os:)

http://docs.python.org/library/select.html

root::2832 jobs:0 [~] # cat stdin_test.py
#!/usr/bin/env python
import sys
import select

r, w, x = select.select([sys.stdin], [], [], 0)
if r:
    print "READABLES:", r
else:
    print "no pipe"

root::2832 jobs:0 [~] # ./stdin_test.py
no pipe

root::2832 jobs:0 [~] # echo "foo" | ./stdin_test.py
READABLES: [<open file '<stdin>', mode 'r' at 0xb7d79020>]

答案 2 :(得分:2)

坏消息。从Unix命令行的角度来看,程序的两次调用相同。

Unix无法轻易区分它们。你所要求的并不是真的合理,你需要考虑使用你的程序的另一种方式。

如果它不在管道中,如果它不读取标准输入,应该读取什么?

是否应该启动GUI?如果是这样,您可能希望使用“-i”( - interactive)选项来指示您需要GUI,而不是读取标准输入。

有时,您可以将管道与控制台区分开来,因为控制台设备是“/ dev / tty”,但这不是可移植的。

答案 3 :(得分:-1)

我不知道我的头脑中的Python命令,但你应该能够使用poll做一些事情,或者选择查找准备阅读标准输入的数据。

这可能是Unix操作系统特有的,在Windows Python上也有所不同。