我想能够产卵在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系统的工作原理最好的任何平台上都在事件的过程。命名管道 将是您所描述的问题,一般的路线,但不会有实施 每个平台上的差异。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top