Python命名管道行为

2024-09-30 01:25:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我主要是一个PLC程序员,任务是编写一些代码在Raspberry Pi2B(Raspbian Wheezzy)上运行,从RPi上运行的另一个进程中获取一些数据,并使这些数据在Modbus TCP(旧的PLC协议)接口上可用。我有它的功能,但现在正在努力防弹。我为IPC选择了命名管道,这就是我的问题所在。在Python(v2.7)示例代码中,如果我启动reader,它将打开并转到readline命令并按预期进行块。当我启动我的writer并选择打开、写入和关闭管道时,它会按预期执行并向管道写入一个记录。然而,读卡器只是坐在那里阻止readline命令。当编写器循环返回并询问是否打开管道时,如果我选择“y”,则我的读者会吐出先前循环中写入的记录。我很高兴我得到了我的数据,但是我不明白为什么“打开”writer中的管道会导致读者在那时获取数据。我想我会在我的作者写下记录后看到读到的数据。另外,我认为在Writer代码中“关闭”管道没有任何作用,因为我可以在第一次通过逻辑打开管道,编写一个记录,然后在下一次通过逻辑时,我可以选择不打开管道,仍然可以成功地编写它。在

  1. 我错过了什么?(有点修辞)
  2. 在循环中写入命名管道的正确方法是什么?在
  3. 为什么读卡器只在编写器“打开”管道之后才获取记录(无论它是否从上一个传递循环打开)?在

先谢谢你,对我好一点……记住,我只是一个被迫进入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

读者:

^{pr2}$

Tags: 数据代码debuglogif管道islogging
1条回答
网友
1楼 · 发布于 2024-09-30 01:25:37

在绞尽脑汁,搜索互联网,反复试验之后,我终于有了答案。问题的关键在于,当我打开管道进行写操作时,我没有指定“缓冲”参数。这导致我的管道写入缓存在缓冲区的某个地方,而不是立即写入管道。每当我“打开”我的写管道时,它都会将缓冲区冲到管道中,然后我的阅读器将其拾起。解决方案是将“0”作为附加参数添加到“open”命令(PipeOut=open(PipeName'w',0)而不是PipeOut=open(PipeName,'w'),从而将缓冲区大小设置为零。现在,当我“写”到管道中时,数据直接进入管道,直到被冲洗干净后才会被搁置。在

相关问题 更多 >

    热门问题