несколько нитей требуют нескольких труб - PullRequest
0 голосов
/ 05 декабря 2011

Я недавно спросил, как получить оболочку python для получения вывода подпроцесса. и получил очень полезный ответ - т.е. подача 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 из нескольких потоков одновременно.

один и тот же подпроцесс. PIPE передается каждому POpen. в той степени, в которой каждая строка чтения получает результаты от обоих подпроцессов.

помимо получения несколько странных результатов, каждый цикл (для строки в нем:)

, кажется, ожидает завершения обоих подпроцессов потоков, прежде чем перейти к

это не то, что я хочу.

  • Так есть ли способ, которым я могу иметь свою ТРУБУ (по одному на поток), чтобы я мог зависеть от того, что каждый поток полностью независим?

Заранее спасибо

1 Ответ

0 голосов
/ 06 декабря 2011

Похоже, я нашел свой ответ - используя 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()
...