如果像这样执行,我希望程序做一件事:
cat something | my_program.py
如果像这样跑,做另一件事
my_program.py
但是如果我从stdin读取,那么它将等待用户输入,所以我想在尝试从stdin读取之前看看是否有任何东西要读.
如果要检测是否有人将数据传输到您的程序中,或者以交互方式运行它,您可以使用isatty来查看stdin是否是终端:
$ python -c 'import sys; print sys.stdin.isatty()' True $ echo | python -c 'import sys; print sys.stdin.isatty()' False
你想要select模块(man select
在unix上)它将允许你测试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: [', mode 'r' at 0xb7d79020>]