4

Win 2003 で正常に動作する単純なコードがあります。

proc = subprocess.Popen('<some python script which runs another process>', stdout = subprocess.PIPE, stderr = subprocess.PIPE, stdin = subprocess.PIPE)
out = proc.communicate()[0]

しかし、Windows 8 ではこの部分です。out = proc.communicate()[0]、ハングします。

誰もこの問題を見たことがありますか?

  • プロセスが本当に終了していることを確認しました(子プロセスが開始されたときにPIDが存在しません)
  • proc.stdout.readlines() を作成することも問題であり、ハングします。stdout に EOF があることを確認する方法は?
  • 子プロセス proc.communicate() を停止すると正常に動作します。

最も簡単な例を次に示します。

import subprocess
proc = subprocess.Popen([sys.executable, "D:\\test.py"], stdout = subprocess.PIPE)
print 'PID', proc.pid #When this PID is printed I see in the taskbr that process is already finished
print 'Output', proc.communicate() # but this part is hangs

そしてコード od test.py:

import os, time
from subprocess import Popen, PIPE

CREATE_NEW_PROCESS_GROUP = 0x00000200  # note: could get it from subprocess
DETACHED_PROCESS = 0x00000008          # 0x8 | 0x200 == 0x208


p = Popen("start /B notepad", shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE,
          creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
print 'Done'
exit()

有効なシナリオですか?

4

1 に答える 1

2

.communicate()孫(メモ帳)が終了するのを待たずに戻ることができるようにするには、次のように試すことができますtest.py

import sys
from subprocess import Popen, PIPE

CREATE_NEW_PROCESS_GROUP = 0x00000200
DETACHED_PROCESS = 0x00000008

p = Popen('grandchild', stdin=PIPE, stdout=PIPE, stderr=PIPE,
          creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)

直接の子プロセスが終了した場合でも、Popen が子プロセスを待機するを参照してください。

于 2013-05-14T11:42:44.140 に答える