0

我最近询问如何让 python shell 获得子进程输出。并得到了非常有用的回应 - 即 为 POpen 提供一个 stdout=subprocess.PIPE

然后使用 p.stdout.readline() 并将结果提供给 print()

        p = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, cwd=StartPath, shell=False)
        it = iter(p.stdout.readline, b'')
        sRet = "## decode Error ##"
        for line in it:
            try:
                sRet = line.rstrip().decode('utf-8')
            except:
                pass

            print(sRet[:PYTHON_WINDOW_WIDTH])

        viRet = p.wait()

但是,我担心当我同时从多个线程调用此 POpen 时会发生什么。

相同的 subprocess.PIPE 被馈送到每个 POpen。延伸到每个 readline 都从两个子流程中获取结果。

除了得到一些古怪的结果外,每个循环(其中的行:)

似乎要等到两个线程子进程都完成后再继续

这不是我想要的。

  • 那么有没有一种方法可以让我的一个管道(每个线程一个),以便我可以依赖每个线程完全独​​立?

提前致谢

4

1 回答 1

0

看起来我找到了答案 - 使用 os.pipe()

结果看起来像这样:

        r,w = os.pipe()

        my_stdout=os.fdopen(r)
        os.close(w)

        p = subprocess.Popen(args, stdout=my_stdout, stdin=subprocess.PIPE, stderr=my_stdout, cwd=StartPath, shell=False)
        it = iter(p.stdout.readline, b'')
        sRet = "## decode Error ##"
        for line in it:
            try:
                sRet = line.rstrip().decode('utf-8')
            except:
                pass

            with MyGlobals.PrintLock:
                print(sRet[:PYTHON_WINDOW_WIDTH])

        viRet = p.wait()
于 2011-12-06T04:41:34.457 回答