我正在打开一个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)

读取的结果始终是:
[错误11]资源暂时不可用
如果我在阻塞模式下读取,它只会阻塞直到生产者终止。然后,它说文件不存在。
我花了好几天的时间试图设置各种模式、权限、锁等,但似乎没有什么能帮到我。这类事情很容易处理常规文件。另外,请再次注意minicom可以毫无障碍地读取pty。此外,使用lsof我可以看到minicom和consumer.py脚本都确实打开了该文件——这只是python示例中不起作用的读取。那么minicom的秘密是什么我试图在minicom源代码中找到这样的代码,但没有找到任何我可以使用的东西。
理想情况下,我的制作人会让打开和阅读变得容易(就像在我的消费者示例中一样),但如果我能看到这部作品,我愿意修改任何一端。。。

最佳答案

是什么让你认为你不能打开私人电话?代码中没有提供有关哪个系统调用失败的信息。
最有可能的情况是,os.read()调用失败,错误代码为EAGAIN(又名EWOULDBLOCK),因为您以非阻塞模式打开了PTY。没有要读取的数据,因为PTY是tty,tty最初处于“cooke”模式,这意味着在发送行尾字符或某个中断字符之前,不会向使用者传递任何输入。Minicom可能通过termios调用将pty置于“原始”模式,您也应该这样做。
我猜你不想把PTY设置成非阻塞模式。除非设置了事件轮询或select循环,否则将重复出现EAGAIN“错误”(这不是真正的错误),并且您真的不想在重试之前等待整整一秒钟。(您也不想关闭并重新打开PTY。)建议您将PTY保留在阻塞模式下,但将其配置为在每次按键时立即返回(再次使用termios)。

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

10-10 15:40