gpt4 book ai didi

python - 无法从外部进程读取 PTY(伪终端文件)

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:50 27 4
gpt4 key购买 nike

我正在打开一个 PTY(在 Python/Linux 中)并写入它。我可以通过 minicom 完美地读取它。但是,我无法在另一个 Python(或 C++)程序中读取它。这是一个最小化的示例:

producer.py(打开 pty/写入它):

import os, sys
from time import sleep
master_fd, slave_fd = os.openpty()
print "minicom -D %s" % os.ttyname( slave_fd )
for i in range(0,30):
d = str(i % 10)
os.write( master_fd, d )
sys.stdout.write( d )
sys.stdout.flush()
sleep( 2 )
os.close( slave_fd )
os.close( master_fd )
print "\nDone"

consumer.py(尝试打开/阅读):

import os, sys
from time import sleep
pts=raw_input("Enter pts number:")
while True:
fd=0
try:
fd=os.open('/dev/pts/%d' % (pts,),
os.O_RDONLY | os.O_NONBLOCK )
sys.stdout.write( os.read(fd, 1 ) )
sys.stdout.flush()
except Exception as e: print e
if fd: os.close(fd)
sleep(1)

读取的结果总是:

[Errno 11] Resource temporarily unavailable

如果我以阻塞模式读取,它只会阻塞直到生产者终止。然后,它说该文件不存在。

我花了好几天时间尝试设置各种模式、权限、锁定等,但似乎无济于事。这种事情很容易与普通文件一起工作。另外,请再次注意 minicom 可以顺利读取 pty。此外,使用 lsof 我可以看到 minicom 和我的 consumer.py 脚本确实打开了文件——这只是在 python 示例中不起作用的读取。那么minicom的 secret 是什么?我试图在 minicom 源代码中找到这样的东西,但我没有成功找到任何我可以使用的东西。

理想情况下,我的制作人会让它易于打开和阅读(就像在我的消费者示例中一样),但如果我能看到这项工作,我愿意修改任何一端...

最佳答案

是什么让您认为无法打开 PTY?您的代码中没有任何内容提供有关哪个系统调用失败的信息。

最有可能的是 os.read() 调用失败,错误代码为 EAGAIN(又名 EWOULDBLOCK),因为您打开了非阻塞模式下的 PTY。没有数据可读,因为 PTY 是一个 tty,而 tty 最初处于“熟化”模式,这意味着在发送行尾字符或某个中断字符之前,不会将任何输入传递给消费者。 Minicom 可能会通过 termios 调用将 pty 置于“原始”模式,您也应该这样做。

我猜您并不是真的想将 PTY 置于非阻塞模式。除非您设置事件轮询或选择循环,否则您将反复收到 EAGAIN“错误”(这不是真正的错误)并且您真的不想在您之前等待整整一秒再试一次。 (您也不想关闭并重新打开 PTY。)最好建议您将 PTY 保持在阻塞模式,但将其配置为在每次击键时立即返回(同样,使用 termios)。

关于python - 无法从外部进程读取 PTY(伪终端文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53305231/

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