Python:子进程Popen挂起

Python:子进程Popen挂起,python,subprocess,Python,Subprocess,我对子流程模块有一个问题,特别是Popen类。我正在学习python中的套接字,有两台服务器通过套接字进行通信。逻辑如下 服务器A向服务器B发送git目录列表。 服务器B迭代git目录列表,并将每个目录的SHA哈希返回给请求服务器A。但是,当出现故障时,问题就会出现。代码: Server B : Python version : 2.4.3 while 1: data=conn.recv(1024) if not data: break #D

我对子流程模块有一个问题,特别是Popen类。我正在学习python中的套接字,有两台服务器通过套接字进行通信。逻辑如下 服务器A向服务器B发送git目录列表。 服务器B迭代git目录列表,并将每个目录的SHA哈希返回给请求服务器A。但是,当出现故障时,问题就会出现。代码:

  Server B : Python version : 2.4.3 

  while 1:
       data=conn.recv(1024)
       if not data: break
       #DEBUG
       #print "data:",data
       proc=subprocess.Popen(["git","--git-dir",'/var/git/temp/'+data,"log","-1","--all","--pretty=format:\"%H\""],stdout=subprocess.PIPE)
       # Ignore failure and move on
       # continue or pass do not seem to work \
       # neither does exception handling
       if proc.wait() !=0 : pass
       sha_hash,err=proc.communicate()
       print sha_hash
       conn.send(sha_hash)

conn.close()
现在,当出现故障时,例如git项目的defaultrevision被设置为HEAD,子流程调用失败,并打印返回代码128,但它只是挂起在那里。我无法找到返回到剩余目录处理的方法,我必须终止该进程。我也尝试过使用poll(),但没有成功。如有任何建议,我们将不胜感激

编辑1:

    Removing wait 

    while 1:
       data=conn.recv(1024)
       if not data: break
       #DEBUG
       #print "data:",data
       proc=subprocess.Popen(["git","--git-dir",'/var/git/temp/'+data,"log","-1","--all","--pretty=format:\"%H\""],stdout=subprocess.PIPE)
       # Ignore failure and move on
       # continue or pass do not seem to work \
       # neither does exception handling
       ## removed wait and just using communicate ##
       sha_hash,err=proc.communicate()
       print sha_hash
       conn.send(sha_hash)

conn.close()

您可以
等待
通信
。两者都等待流程完成,因此如果流程等待输入,则永远不会到达后者。我明白你的意思。我后来添加了等待部分,因为我不确定如何绕过这种情况。因此,即使我删除了等待部分,只使用communicate,它仍然会给出相同的结果。正在更新我的代码以反映此更改。您确定要启动流程吗?conn.recv()是否获取其输入?我的意思是,它是非阻塞的吗?好吧,它似乎是启动的,因为我在o/p:data:data_test1.git“5AE510385A9CD0EEAA8BFD369EB0EC69BEE10BF”data:data_test2.git“dac785d53e3b580d28cee34501620f0e4b78d243”data:data_test3.git“76CC596B25DD9C277B9133812CE65821328323BF”data:data:data_test4.git“Ba0DD781BBC0621D1695DC98C5”数据:data_test5.git致命:错误的默认版本“HEAD”#这就是问题的症结所在如果您认为
子流程
有问题,请删除不相关的
连接recv()
连接发送()
,例如,从本地文件读取
数据
,看看是否可以重现问题。或者更好的方法是,创建一个虚拟git存储库,触发
fatal:bad default revision'HEAD'
错误,并查看
Popen()
是否继续被卡住。