从sys.stdin中读取不带换行符或EOF的输入

7

我想从我的GPS跟踪器接收数据。它通过TCP发送数据,因此我使用xinetd来监听一些TCP端口和Python脚本来处理数据。这是xinetd配置:

service gps-gprs
{
    disable     = no
    flags       = REUSE
    socket_type = stream
    protocol    = tcp
    port    = 57003
    user        = root
    wait        = no
    server      = /path/to/gps.py
    server_args     = 3
} 

/etc/services中的配置

gps-gprs        57003/tcp           # Tracking system

还有Python脚本gps.py

#!/usr/bin/python
import sys

def main():
    data = sys.stdin.readline().strip() 
    #do something with data
    print 'ok'

if __name__ =='__main__':
    main()

这个跟踪器以类似原始文本的数据字符串发送数据,例如

$GPRMC,132017.000,A,8251.5039,N,01040.0065,E,0.00,,010111,0,,A*75+79161234567#

问题在于Python脚本中的sys.stdin无法接收行尾或文件结尾字符,因此sys.stdin.readline()会一直运行下去。我尝试使用另一台电脑上的Python脚本发送数据。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('', 57003))
s.sendall( u'hello'  )
data = s.recv(4024)
s.close()
print 'Received', data

如果消息是'hello',它就会失败,但如果消息是'hello\n',一切都很好。但我不知道如何告诉tracker或xinetd在消息末尾添加'\n'。如何从sys.stdin读取数据而不带有EOF或EOL?


дёәд»Җд№ҲйңҖиҰҒдҪҝз”Ё.readline()пјҹ.read()дёҚиЎҢеҗ—пјҹ - Martijn Pieters
我猜你需要.read()直到遇到一个特定的信号,它说“在这里中断”,它不一定是换行符,可能是末尾的#或开头的$ - jadkik94
4个回答

8

简单:

data=sys.stdin.read().splitlines()

for i in data:
        print i

没有换行符


这段代码将整个stdin缓冲区读取为一个字符串,并在该字符串中创建了一个包含所有行的列表。然后,它逐行将它们打印到stdout。对于任何有意义的大型输入来说,这是一个糟糕的想法。 - undefined

7

sys.stdin.readline()会一直等待直到接收到一个换行符。然后它会认为当前这行已经完成并且完整地返回它。如果您想读取不包含换行符的数据,或者在处理部分数据之前不想等待接收到一个换行符,那么你需要使用其他方法来代替readline。最有可能的是调用read,它可以读取任意大小的数据。

然而,您的GPS似乎以众所周知的NEMA格式发送数据,并且该格式肯定在每行末尾使用换行符终止。实际上,它可能会在每行末尾使用CRLF (\r\n),但有可能在到达TCP套接字之前,\r会被篡改。无论哪种情况,每行末尾都有一个\n

如果您的readline调用一直挂起而没有返回任何行,则很可能是发送方正在缓冲行,直到填满缓冲区。如果您等待足够长的时间,发送方的缓冲区就会填满,然后您就可以一次得到大量行。如果发生了这种情况,则必须更改发送方,以便在每个NEMA语句后刷新其发送缓冲区。


2

看起来你收到的是#而不是<CR><LF>,只需读取直到#符号。

data = ""
while len(data) == 0 or data[-1] <> '#':
    data += sys.stdin.read(1)

#do something with data
print 'ok'

2

我的解决方案:

var = sys.stdin.readline().replace('\n', '')

它:

  • 查找条目中的换行符,
  • 从条目中用''(无)替换它~删除,
  • 将其分配给变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接