【发布时间】:2013-10-21 18:06:49
【问题描述】:
在运行 Apache 的生产服务器上运行我的 Django 项目时,subprocess.CalledProcessError 有一个奇怪的问题:
我的代码(更新:添加了捕获所有异常处理 - 行为未更改)如下:
try:
command_string = 'gcc -O0 -g3 -Wall -c -fmessage-length=0 ' + cfile + ' -o ' + ofile
compile_result = subprocess.check_output(command_string,stderr=subprocess.STDOUT,shell=True)
#logger.warning(compile_result)
if compile_result != "": #Dann gab es einen Fehler bzw. ein Compiler-Warning --> Abbruch!
self.ausgabe = u"Compile:\n"
self.ausgabe += unicode(compile_result, "utf-8")
return
except subprocess.CalledProcessError as e:
self.ausgabe = u"Compilierfehler (Returncode {0}):\n".format(e.returncode)
self.ausgabe += unicode(e.output, "utf-8")
logger.error("CPE" + unicode(e.returncode, "utf-8") + unicode(e.output, "utf-8"))
return #die weiteren Schritte müssen gar nicht erst ausgeführt werden...
except:
logger.error(str(sys.exc_info()))
self.ausgabe = u"Compilieren nicht erfolgreich. Fehler:\n" + unicode(sys.exc_info(), "utf-8")
return
当我在我的 Windows 开发机器和 djange 测试服务器上运行它时,这一切都按预期工作。命令执行失败时捕获异常,错误处理按预期工作。
当我将代码移动到我的生产服务器(ubuntu、apache)时,当命令执行失败时,我会收到“内部服务器错误 500”,这不是所需的行为。 apache error.log 不是很有帮助,因为它没有显示任何错误。
我的配置是: Apache/2.2.22 (Ubuntu) PHP/5.4.9-4ubuntu2.3 mod_wsgi/3.4 Python/2.7.4
(是的,我重新启动了 apache,我确定我运行的是相同的代码)。
对此有什么想法吗?
【问题讨论】:
-
如果捕获所有异常处理没有捕捉到这个,那么要么您没有运行此代码,要么生产中的异常发生在外部
try块。 500 甚至可能是由于完全python 之外的错误。 -
在这部分代码中引入一个故意的错误,看看您是否看到生产中的行为发生变化。这至少可以让您排除运行陈旧代码的可能性。
-
感谢@MartijnPieters!我介绍了 ZeroDevisionError 和 - tadaa - 相同的行为。这启发了我从不同的角度检查我的异常处理——长话短说,发现了另一个编码问题。我将在问题的答案中更详细地解释。
-
顺便说一句:现在是否可以结束赏金并将 50 点捐赠给@MartijnPieters?
-
我必须发布一个答案,然后你可以将赏金奖励给那个。如果您想这样做,请重新发布我的 cmets 作为答案。 :-)
标签: python django apache subprocess