Python readline和readlines行为

时间:2014-05-15 18:27:02

标签: python io subprocess

我写了一小段代码,涉及使用子进程运行一个侦听一些实时数据的脚本

这是我的代码:

def subscriber():
    try:
        sub = subprocess.Popen('start listner', 
                               stdout=subprocess.PIPE, 
                               stderr=subprocess.Pipe)
    except Exception as e:
        print(e)
    return sub

def main():
    mysub = spark_subscriber()
    while True:
        # 1st version
        try:
            out = mysub.stdout.readline()
            print(out)
            sleep(1)
        # 2ndversion
        #try:
        #    out = mysub.stdout.readlines()  #notice the s
        #    print(out)
        #    sleep(1)
        # 3rd version
        #try:
        #    out = mysub.stdout.readlines()  #notice the s
        #    print(out)
        # 4th version
        #try:
        #    out = mysub.stdout.readline()
        #    print(out)
        except KeyboardInterrupt:
            exit_program(0)

第一行的行为一次输出一行,睡眠1秒,然后输出下一行,直到打印完所有。

由于我想一次打印所有行,我只是将readline()更改为readlines()并获得了第二个版本,我的预期输出将是所有行。 - 无论我等多久都没有打印出来

编辑:第3版也没有输出

有效的是第4次

我现在对readline(),readlines()背后的整个机制感到有些困惑。

有人可以解释为什么readlines()不起作用吗?

另外,如果readlines()可以在这种情况下工作,有人可以提供一个有sleep()和没有sleep()的工作示例吗?

编辑:我在这里犯了一个大错,第4版本应该是正常工作的,第3版本不起作用

2 个答案:

答案 0 :(得分:2)

readlines在没有任何内容可供阅读之前不会返回结果,因此它将继续等待数据,直到数据的生产者退出(程序中的start_listner)。

答案 1 :(得分:0)

我以一个HTML文件为例来说明read(),readline()和readlines()的确切用法。 显示文件的内容:

chiru@python:~$ cat test.html
<html>
<head>
    <title>Feature information</title>
</head>
<body>
    <table border="1">
        <tr><th>Feature</th><th>Start</th><th>End</th></tr>
        <tr><td>a</td><td>a</td><td>a</td></tr>
        <tr><td>b</td><td>a</td><td>a</td></tr>
        <tr><td>v</td><td>a</td><td>a</td></tr>
    </table>
</body>
</html>
chiru@python:~$ 

打开Python控制台:

chiru@python:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more    information.

以读取模式创建文件处理程序:

>>> fh=open('test.html','r')
>>> fh
<open file 'test.html', mode 'r' at 0x7ff70408d4b0>

Read():此函数将整个文件作为单个字符串读取。用法如下所示。

>>> fh.read()
'<html>\n<head>\n <title>Feature information</title>\n</head>\n<body>\n<table border="1">\n<tr><th>Feature</th><th>Start</th><th>End</th></tr>\n<tr><td>a</td><td>a</td><td>a</td></tr>\n<tr><td>b</td><td>a</td><td>a</td></tr>\n<tr><td>v</td><td>a</td><td>a</td></tr>\n</table>\n</body></html>\n'
>>> 
>>> fh.read()
''

Readline():此函数将只读一行作为单个字符串。用法如下所示。

>>> fh=open('test.html','r')
>>> fh
<open file 'test.html', mode 'r' at 0x7ff70408d540>
>>> fh.readline()
'<html>\n'

Readlines():此函数将所有行读作单个列表字符串。

>>> fh.readlines()
['<head>\n', ' <title>Feature information</title>\n', '</head>\n', '<body>\n', '<table border="1">\n', '<tr><th>Feature</th><th>Start</th><th>End</th></tr>\n', '<tr><td>a</td><td>a</td><td>a</td></tr>\n', '<tr><td>b</td><td>a</td><td>a</td></tr>\n', '<tr><td>v</td><td>a</td><td>a</td></tr>\n', '</table>\n', '</body></html>\n']
>>>