------------------------程序员的分割线----------------------------------
不是很确定本文的名称是否够准确,我的意思是,我想记录一下如何让python程序能够通过命令行的管道来接收数据,就像我们用管道符号(|)连接多个程序一样,前一个程序的输出对接后一个程序的输入,其中有一个是你的python程序。
管道数据来自stdin,通过sys模块,我们可以访问stdin对象,即sys.stdin。
基本思路是:在程序中读取sys.stdin中的内容,这就是通过管道过来的数据!(其实通过input函数接收的数据,也可以在sys.stdin中读取,不过这是程序的交互过程;而通过管道,是在程序启动的时候,数据就已经准备好了;管道也无法解决程序交互过程的输入)
在写代码验证的时候,遇到了一个小问题:sys.stdin.read()函数默认是阻塞的,而如果程序不结束,就不会出现EOF,程序就在read函数这里死等了。因此,要将read函数设置为非阻塞的方式,用fcntl模块的接口。
整个可运行的代码如下:
$ cat py_stdin.py
import os
import sys
import fcntl
fcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)
try:
cc = sys.stdin.read()
except TypeError as e:
print('no std input re