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

Posted

技术标签:

【中文标题】Python子进程阻塞并获取BadStatusLine异常【英文标题】:Python subprocess blocking and getting BadStatusLine exception 【发布时间】:2013-03-18 22:36:33 【问题描述】:

我有一个在服务器 (apache) 上运行的 Django Web 应用程序,我正在尝试使用以下代码从 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 异常。我搜索了一下,发现子进程在尝试重新输出输出时可能会阻塞......所以我尝试了这段代码:

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 解释器,它运行良好,从输出中成功捕获了结果我猜 subprocess 块可能与 apache 有关......老实说我不知道下一步该做什么我已经厌倦了 python 文档中存在的许多方法 http://docs.python.org/2/library/subprocess.html 但没有工作

感谢您的帮助。

【问题讨论】:

我强烈建议现在通过 http 请求调用 subprocess,它有可能在 *** 中咬你。而是使用像 celery celeryproject.org 这样的东西并将其作为单独的进程运行。 这个链接更多地讨论了 BadStatusLine ***.com/questions/8734617/… 关于 celery..,我应该使用客户端的 celery 来调用这个方法吧? 如果集成新库不是你的事,请尝试使用 python commands bundle,我更喜欢使用子进程:docs.python.org/2/library/commands.html 谢谢 themanatuf 但是我第一次尝试运行 javac 命令时使用了 command.getstatusoutput(....) 但它失败并出现同样的错误所以我开始搜索如何重定向输出并最终找到一种异步执行javac的方法 【参考方案1】:

我已经成功安装了 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 重定向输出,但也失败了

谢谢

【讨论】:

以上是关于Python子进程阻塞并获取BadStatusLine异常的主要内容,如果未能解决你的问题,请参考以下文章

PYTHON-进程 子进程

python非阻塞recv与进程之间的管道?

从 python 子进程获取输出并向其发出命令

python子进程模块subprocess详解与应用实例 之二

python学习笔记——拾

在没有flush()和新行的子进程输出上进行非阻塞读取