题
我想能够产卵在python的方法和具有双向通信。当然,Pexpect的做到这一点,并确实是一个办法,我可能会去。然而,这是不太理想的。
我的理想的情况是有一个跨平台的通用技术,仅所涉及的标准Python库。子过程变得相当接近,但事实上,我不得不等待的过程与它交互安全之前终止是不可取的。
在文件来看,它确实说有一个标准输入,标准输出和我可以直接操作标准错误文件描述符,但有一个大胖子警告,说:“不这样做”。不幸的是,为什么存在,但是从我从谷歌收集此警告它不是完全清楚的是,它是关系到操作系统缓存,并且可以编写代码时,这些内部缓存失效(如一个侧面说明这意外锁死,任何例子是显示错误的方式和正确的方式,将不胜感激)。
因此,冒着我的代码潜在的死锁,我想这可能是有趣的,使用轮询或选择以交互方式从正在运行的进程读取,而不杀死它。虽然我失去了(我认为)的跨平台能力,我喜欢它不需要额外的库的事实。但更重要的,我想知道这是否这是一个好主意。我还没有尝试这种方法,但我关心的陷阱可能潜在地摧毁我的计划。它可以工作吗?我应该怎么测试?
在我的具体情况我并不真正关心的是能够写入的过程中,只是一再从中读取。另外,我不希望我的进程转储文本的巨额资金,所以希望避免死锁问题,但是我想知道到底是什么的限制是,并能编写一些测试,看看它打破了。
解决方案
请原谅在这个题目我的无知,但不能你只是推出蟒蛇与“缓冲” -u标志?
这也可能会感兴趣... http://www.gossamer-threads.com/lists/python/python/ 658167个
其他提示
使用在Python 2.6标准库多处理模块。
它有一个队列类,它可以同时用于读出和写入。
我这样做在一个单独的线程,使用消息队列线程之间进行通信。在我的情况下,子版画%完成到标准输出。我想主线程把一个漂亮的进度条。
if sys.platform == 'win32':
self.shell = False
self.startupinfo = subprocess.STARTUPINFO()
self.startupinfo.dwFlags = 0x01
self.startupinfo.wShowWindow = 0
else:
self.shell = True
self.startupinfo = None
。 。
f = subprocess.Popen( cmd, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE, env = env, shell = self.shell, startupinfo = self.startupinfo )
f.stdin.close()
line = ''
while True:
log.debug('reading')
c = f.stdout.read(1)
log.debug(c)
if len(c) == 0:
log.info('stdout empty; must be done')
break;
if ord(c) == 13:
continue
if c == '%':
# post % complete message to waiting thread.
line = ''
else:
line += c
log.info('checking for errors')
errs = f.stderr.readlines()
if errs:
prettyErrs = 'Reported Errors: '
for i in errs:
prettyErrs += i.rstrip('\n')
log.warn( prettyErrs )
#post errors to waiting thread
else:
print 'done'
return
在简短的答案是,有没有这样的事情,作为过程管理良好的跨平台系统,没有设计这个概念进入你的系统。这一点尤其在STANDAR库。即使是不同的UNIX版本都有自己的兼容性问题。
您最好的选择是所有的仪器与适当的事件处理注意到,无论从任何IPC系统的工作原理最好的任何平台上都在事件的过程。命名管道 将是您所描述的问题,一般的路线,但不会有实施 每个平台上的差异。