gpt4 book ai didi

python - 在一个模块中打开命名管道,在另一个模块中读取

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:48 25 4
gpt4 key购买 nike

我正忙于为我的一个项目想出办法,但在一个问题上挂断了:

我正在使用 FIFO 操作将“信号”(简单 T/F)从一个模块发送到另一个模块。一个模块打开 FIFO 进行写入,另一个模块打开 FIFO 进行读取。这里的目标是让读取模块在写入模块收到命令后立即读取并显示。写入模块打开了FIFO,但是读取模块好像没有打开。

我正在尝试做的事情是否可行?我试图在 _threads 中旋转这两个操作,以便在每个模块中保持多个进程。请注意,为了简洁起见,我没有包含这两个模块的类(解释“self”)。

原始发送模块

def pipe_relay(self):
FIFO = 'pipe_relay'
thread_num = num

try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise

while self.relay_switch:
print("Opening FIFO...")
with open(FIFO) as fifo:
print("FIFO opened")
while self.relay_switch:
data = fifo.write(signal)
if len(data) == 0:
print("Writer is closed")
break
print('Write: "{0}"'.format(data))

更新发送模块

我意识到我不想用我扔给它的数据连续写入 FIFO,所以我删除了 while() 语句。现在,似乎 FIFO 根本不会打开......


def pipe_relay(self, num, signal):
FIFO = 'pipe_relay'
thread_num = num

try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise

print("Opening FIFO...")

# does not proceed past this point

with open(FIFO, mode = 'w') as fifo:
print("FIFO opened")
data = fifo.write(signal)
if len(data) == 0:
print("Writer is closed")
print('Write: "{0}"'.format(data))
fifo.close()

接收模块

def pipe_receive(self):
FIFO = 'pipe_relay'

try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise

# module proceeds to here, but no further

with open(FIFO) as fifo:
print("FIFO opened (receiver)")
while True:
data = fifo.read()
if len(data) == 0:
print("Writer is closed")
break
print('Read signal: "{0}"'.format(data))
self.DISPLAY['text'] = data
print("this is in 'pipe_receieve'")

编辑

运行 Ubuntu 17.04。该项目是为 Python 3.5 解释器编写的。

最佳答案

以下是使用 Python 3.5.2 编写的简单发送和获取代码段。
注释掉 fifo.flush() 行并查看行为差异。
使用 flush,获取代码与发送代码一起运行。
没有它,get代码直到fifo关闭才会有反应

发送.py

import sys, os, time

path = "/tmp/my.fifo"
try:
os.mkfifo(path)
except:
pass
try:
fifo = open(path, "w")
except Exception as e:
print (e)
sys.exit()
x = 0
while x < 5:
fifo.write(str(x))
fifo.flush()
print ("Sending:", str(x))
x+=1
time.sleep(3)
print ("Closing")
fifo.close()
try:
os.unlink(fifo)
except:
pass

get.py

import os, sys

path = "/tmp/my.fifo"
try:
fifo = open(path, "r")
except Exception as e:
print (e)
sys.exit()
while True:
r = fifo.read(1)
if len(r) != 1:
print ("Sender Terminated")
break
print ("Received:", r)
fifo.close()

关于python - 在一个模块中打开命名管道,在另一个模块中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46179363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com