当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《判断一个Python程序是否有从stdin读取的内容的最佳方法是什么?》经验,为你挑选了2个好方法。

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

cat something | my_program.py

如果像这样跑,做另一件事

my_program.py

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



1> brian-brazil..:

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

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



2> Trey Stout..:

你想要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>]


仅当输入可用时,这不会告诉您输入是否为管道.考虑:(睡1 && echo"foo")| ./stdin_test.py在我的机器上报告"无管道".
有趣的笔记。我认为那只是因为选择没有阻塞。当我将0更改为5时,您的示例正确显示了打开的文件。确实应该将其放入一个循环中,然后可以循环直到获得数据为止。好点子 :)
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有