我写了一小段代码,涉及使用子进程运行一个侦听一些实时数据的脚本
这是我的代码:
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版本不起作用答案 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']
>>>