如何解决在Python中从终端读取
| 如何在Python中从终端接收输入? 我正在使用Python连接到另一个程序,该程序从用户输入生成输出。 我正在使用subprocess.Popen()输入程序,但我无法将stdout设置为subprocess.PIPE,因为该程序似乎从未刷新过,因此所有内容都卡在了缓冲区中。 该程序的标准输出似乎是要打印到终端,并且当我不重定向标准输出时会看到输出。但是,我需要Python读取和解释终端中现在的输出。 抱歉,这是一个愚蠢的问题,但是我似乎无法解决这个问题。解决方法
子进程中的缓冲是一个常见问题。这是四种可能的方法。
首先,也是最简单的,您可以一次从管道读取一个字节。这就是我所说的\“ dirty hack \\”,它会降低性能,但是很简单,它保证read()调用只会阻塞直到第一个字节进入,而不是等待缓冲区来填满\永远不会填满。但是,这不会强制其他进程刷新其写缓冲区,因此,如果这是问题所在,则该方法将无济于事。
其次,我认为最简单的方法是考虑使用Twisted框架,该框架具有使用虚拟终端或pty(我认为是“ pseudo-teletype”)与您的子进程进行对话的功能。但是,这可能会影响您的应用程序的设计(可能会更好),但是无论如何,这可能都不适合您。 http://twistedmatrix.com/documents/current/core/howto/process.html
如果以上两种方法都不适合您,那么您将不得不自己解决棘手的I / O并发问题。
第三,尝试使用带有O_NONBLOCK的fcntl()将管道(所有管道在fork()之前)设置为非阻塞模式。然后,您可以在尝试读取/写入之前使用select()测试读取/写入的准备情况;但是您仍然必须捕获IOError并测试EAGAIN,因为即使在这种情况下也可能发生。根据子进程的行为,这可以让您等到数据真正显示后再尝试读入。
最后的方法是自己实现PTY逻辑。如果您看到过诸如termio选项,ioctl()调用等之类的内容的引用,那么您将要面对。我以前没有做过这件事,因为它很复杂,而且我从未真正需要这样做。如果这是您的命运,请祝您好运。
, 您是否尝试过将
Popen
对象中的bufsize
设置为0
?我不确定是否可以强制将缓冲区从接收大小中取消缓冲,但是我会尝试一下。
http://docs.python.org/library/subprocess.html#using-the-subprocess-module
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。