gpt4 book ai didi

python - 尝试在 python 中的文件对象上调用 readline() 但它正在暂停

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:35 30 4
gpt4 key购买 nike

我正在使用 readline() 函数从通过子进程模块获得的文件对象中读取数据:proc = subprocess.Popen(cmd, bufsize=0, stdout=subprocess.PIPE) .这使我可以将 proc.stdout 用作带有 proc.stdout.readline() 的类文件对象。我的问题是这会暂停等待输入,我希望它超时并在我进行 readline 调用时如果那里没有输入继续前进。我正在运行 Python 2.4,如何让 readline 方法停止暂停?谢谢。

最佳答案

在 posix-y 平台(基本上是除 Windows 以外的任何流行平台)上,select模块为此提供了正确的工具。不幸的是,在 Windows 上,select 仅适用于套接字(不适用于 subprocess.Popen 将使用的管道),因此那里的情况并不十分清楚。是否需要在 Windows 上运行...?

如果没有,只需在 select.select 调用中使用子进程对象 pp.stdout.fileno()短超时——真的很简单!

编辑:这是一个简单的例子(当然假设需要导入):

>>> def f():                                                                    
... p = subprocess.Popen("sleep 10; echo ciao", shell=True, stdout=subprocess.PIPE)
... while True:
... r, w, x = select.select([p.stdout.fileno()],[],[],1.0)
... if r: return p.stdout.read()
... print 'not ready yet'
...
>>> f()
not ready yet
not ready yet
not ready yet
not ready yet
not ready yet
not ready yet
not ready yet
not ready yet
not ready yet
not ready yet
'ciao\n'
>>>

请注意,没有办法“等待完整的行”:这会等待“所有输出”(然后阻塞直到所有输出准备就绪)。要阅读可用的内容,请使用 fcntl设置 os.O_NODELAY在开始循环之前在文件描述符上(fileno() 返回的内容)。

关于python - 尝试在 python 中的文件对象上调用 readline() 但它正在暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426250/

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