【问题标题】:multiple threads require multiple pipes多个线程需要多个管道
【发布时间】:2012-01-12 22:40:48
【问题描述】:

我最近询问如何让 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 都从两个子流程中获取结果。

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

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

这不是我想要的。

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

提前致谢

【问题讨论】:

    标签: python-3.x pipe python-multithreading


    【解决方案1】:

    看起来我找到了答案 - 使用 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()
    

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 2011-08-29
      • 1970-01-01
      • 2015-04-27
      • 2015-06-09
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2018-09-15
      相关资源
      最近更新 更多