Python命名pipe道行为

Python命名pipe道行为,第1张

概述Python命名pipe道行

我主要是一位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道行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1275990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存