我主要是一位PLC编程人员,他负责编写一些代码在RaspBerry Pi2B(Raspbian Wheezy)上运行,从RPi上运行的另一个进程中获取一些数据,并在Modbus TCP( 旧的 PLC协议)接口上提供这些数据。 我有它的工作,但我现在试图防d。 我selectIPC命名pipe道,这是我的问题。 在我的Python(v2.7)示例代码中,如果启动我的阅读器,它会打开并按照预期转到readline命令和块。 当我开始写作并select打开,写入和closurespipe道时,它按预期工作,并向pipe道写入logging。 然而,读者只是坐在那里阻止readline命令。 当作者环回并询问是否打开pipe道时,如果我select“y”,则读取器将吐出前一个循环中写入的logging。 我很高兴得到了我的数据,但不明白为什么在作者中“打开”pipe道使得读者在当时获取数据。 我想我的作者写完logging后会看到读取的数据。 另外,我认为在Writer代码中“closures”pipe道并不会做任何事情,因为我可以通过逻辑第一次打开pipe道,写一个logging,然后在下一个通过逻辑我可以select不打开pipe道,仍然成功地写入。
我在这里错过了什么? (修辞,sorting)
在循环中写入命名pipe道的正确方法是什么?
为什么读者只能在Writer“打开”pipe道之后抓取一条logging(无论是否通过循环的前一个循环打开)?
提前致谢,对我很好…记住,我只是一个已经被迫进入Python世界的老PLC程序员!
作家:
#!/usr/bin/env python import logging logging.basicConfig(format='%(asctime)s %(message)s') log = logging.getLogger() log.setLevel(logging.DEBUG) log.deBUG('Logging has started') log.deBUG('DocTest Pipe Writer') import os,time,sys Pipename = 'DocTestPipe' if not os.path.exists(Pipename): log.deBUG('Pipe not present...Creating...') os.mkfifo(Pipename,0777) log.deBUG('Pipe is made') else: log.deBUG('Pipe already present') ModbusSeed = 0 while True: OpenPipe = raw_input ('Open pipe? y or n') if OpenPipe == 'y': log.deBUG('opening pipe') PipeOut = open(Pipename,'w') log.deBUG('Pipe is open for writing.') else: log.deBUG('Chose not to open pipe') DatAPIpestring = '%05d' % ModbusSeed+','+'%05d' % (ModbusSeed+1)+','+'%05d' % (ModbusSeed+2)+','+ '%05d' % (ModbusSeed+3)+','+'%05d' % (ModbusSeed+4)+','+'%05d' % (ModbusSeed+5)+','+ '%05d' % (ModbusSeed+6)+','+'%05d' % (ModbusSeed+7)+','+'%05d' % (ModbusSeed+8)+','+ '%05d' % (ModbusSeed+9)+'n' print 'Pipe Data to write: '+DatAPIpestring WritePipe=raw_input('Write Pipe? y or n') if WritePipe == 'y': log.deBUG('Writing pipe') PipeOut.write(DatAPIpestring) log.deBUG('Pipe is written.') ClosePipe = raw_input('Close pipe? y or n') if ClosePipe == 'y': log.deBUG('Closing pipe') PipeOut.close log.deBUG('Pipe is closed') else: log.deBUG('Pipe left open') ModbusSeed=ModbusSeed+1
读者:
如何连接Raspbian上的TA +数据库(Firebird)?
sudo关机后启动RaspBerry Pi?
EPSON TM-T20II使用RPI2进行打印
使用Cli omxplayer – RaspBerry Pi调整音量
你的PATH中似乎没有“make”或“gmake” – MinGW32(windows)
#!/usr/bin/env python import logging logging.basicConfig(format='%(asctime)s %(message)s') #,filename='DocTestLog') log = logging.getLogger() log.setLevel(logging.DEBUG) log.deBUG('Logging has started') log.deBUG('Modbus Server started.') import os,0777) log.deBUG('Pipe is made') else: log.deBUG('Pipe already present') log.deBUG('Open pipe for reading') PipeIn = open(Pipename,'r') log.deBUG('Pipe is open for reading') while True: #raw_input('Press any key to read pipe') log.deBUG('Reading line') try: Pipestring = PipeIn.readline() [:-1] except: print 'nothing there' #Pipestring = PipeIn.read() log.deBUG('Pipestring = '+Pipestring)
树莓派2和BMP280:从属地址未被确认
为什么需要在桌面上启用windows开发者模式才能在RaspBerry Pi上开发?
SPI linux驱动程序
Qt Creator适用于RaspBerry Pi 2交叉编译和远程部署的设置 – 为错误的体系结构生成二进制文件
windows 10物联网核心 – vIDeo打开closures
经过多次的搔抓,网上冲浪,反复试验,我有我的答案。 问题的关键是,当我打开我的管道写作时,我没有指定一个“缓冲”的参数。 这导致我的管道写入被缓存在缓冲区的某处,而不是立即写入管道。 每当我“打开”我的写入管道时,它将缓冲区冲刷到管道上,然后我的读者将其拾取。 解决的办法是在我的“打开”命令(PipeOut = open(Pipename,'w',0)而不是PipeOut = open(Pipename,'w'))中添加“,0”作为附加参数,大小为零。 现在,当我“写”到管道中时,数据直接传送到管道,不会坐在一旁,直到冲刷。
总结以上是内存溢出为你收集整理的Python命名pipe道行为全部内容,希望文章能够帮你解决Python命名pipe道行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)