Python子进程阻塞并获取BadStatusLine异常

时间:2013-03-28 13:09:16

标签: python django apache subprocess

我有一个在服务器上运行的Django Web应用程序(apache),我正在尝试使用以下代码从Python代码编译Java文件:

def comp(request):
   p = subprocess.Popen(['javac',filepath],stdout=subprocess.PIPE,stderr=subprocess.PIPE, bufsize=100)
      res, err =p.communicate()

   return HttpResponse (err)

调用comp方法时,我得到BadStatusLine异常。我搜索了它,我发现在尝试reed输出时子进程可能会阻塞...所以我尝试了这段代码:

def comp(request):
   p = subprocess.Popen(['/usr/bin/javac',filepath],stdout=subprocess.PIPE,stderr=subprocess.PIPE, bufsize=100)
   while p.returncode == None:
      res, err =p.communicate()
   if p.returncode != 0:
      err = "whatever"
   return HttpResponse (err) 

它还在阻止

我已经尝试将第一个代码直接写入python解释器并且工作正常,结果从输出中成功捕获我猜这个子进程块与apache有关...也许我真的没有知道接下来要做什么我已经厌倦了python doc中的许多方法 http://docs.python.org/2/library/subprocess.html但没有工作

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我已成功安装Celery并且我使用Redis作为消息队列,我能够运行任务并从我启动的任何子进程获取输出,除了javac,输出始终为空字符串 这是任务代码:

class JavaSubTask(Task):

   def run(self, filepath, **kwargs):
      p = subprocess.Popen(["/usr/bin/javac",filepath],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
      p.wait()
      command_output, err = p.communicate()
 return(command_output + err)
tasks.register(JavaSubTask)

我正在用

运行芹菜
python manage.py celeryd worker -l INFO

我也尝试过pexpect模块,但是给出了相同的结果(还有commands.getstatusoutput) 我还尝试将输出重定向为2>& 1但也失败了

由于