1

我有一个在服务器(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中存在的许多方法中存在的许多方法,但没有一个有效

谢谢您的帮助。

4

1 回答 1

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 重定向输出,但也失败了

谢谢

于 2013-04-04T09:28:35.643 回答