【发布时间】: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 stackoverflow.com/questions/8734617/…
-
关于 celery..,我应该使用客户端的 celery 来调用这个方法吧?
-
如果集成新库不是你的事,请尝试使用 python
commandsbundle,我更喜欢使用子进程:docs.python.org/2/library/commands.html -
谢谢 themanatuf 但是我第一次尝试运行 javac 命令时使用了 command.getstatusoutput(....) 但它失败并出现同样的错误所以我开始搜索如何重定向输出并最终找到一种异步执行javac的方法
标签: python django apache subprocess