2010-08-06 17 views
2

我正在使用readline()函数从通过子进程模块获取的文件对象中读取数据:proc = subprocess.Popen(cmd, bufsize=0, stdout=subprocess.PIPE)。这允许我使用proc.stdout作为proc.stdout.readline()的文件类对象。我的问题是,这暂停等待输入,并且如果在进行readline调用时没有输入,我希望它超时并继续前进。我正在运行Python 2.4,我怎样才能让readline方法停止暂停?谢谢。试图调用python中的文件对象的readline(),但它正在暂停

回答

3

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

如果没有,只需使用子过程对象p中的p.stdout.fileno()调用select.select并使用短暂超时 - 这非常简单!

编辑:这里有一个简单的例子(假设当然需要进口):

>>> 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())。

+0

不,这是运行在CentOS 5.5 – Anon 2010-08-06 17:39:46

+0

@William,那么我的第二段应该给你“王国的关键”;-)。你需要一些示例代码来帮助你进一步......? – 2010-08-06 17:41:34

+0

你可以吗?我会很感激,谢谢。 – Anon 2010-08-06 17:42:41

相关问题