Python CalledProcessError在apache上导致500错误,即使它已被(或应该被)捕获

Python CalledProcessError在apache上导致500错误,即使它已被(或应该被)捕获,python,django,apache,subprocess,Python,Django,Apache,Subprocess,在运行Apache的生产服务器上运行Django项目时,我的子进程出现了一个奇怪的问题。被称为“进程错误”: 我的代码(更新:添加了捕获所有异常处理-行为不变)如下所示: try: command_string = 'gcc -O0 -g3 -Wall -c -fmessage-length=0 ' + cfile + ' -o ' + ofile compile_result = subprocess.check_output(command_string,stderr=sub

在运行Apache的生产服务器上运行Django项目时,我的
子进程出现了一个奇怪的问题。被称为“进程错误”:

我的代码(更新:添加了捕获所有异常处理-行为不变)如下所示:

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 testserver上运行它时,这一切都按照预期工作。当命令执行失败时捕获异常,错误处理按预期工作

当我将代码移动到我的生产服务器(ubuntu、apache)时,当命令执行失败时,我会得到一个“内部服务器错误500”,这不是期望的行为。apacheerror.log不是很有用,因为它没有显示任何错误

我的配置是: Apache/2.2.22(Ubuntu)PHP/5.4.9-4ubuntu2.3 mod_wsgi/3.4 Python/2.7.4

(是的,我重新启动了apache,我确信我运行的代码是相同的)


关于这一点有什么想法吗?

多亏了Martijn Pieters的评论和问题,我发现了一些错误,这些错误导致了奇怪的行为:

  • except subprocess.CalledProcessError as e:
    部分包含一些unicode转换,这些转换在系统a上运行良好,并在系统b上导致问题。因此,在我的异常处理中引发了UnicodeConversionError,这导致了500错误,因为它没有被捕获

  • 发布代码中的另一个问题是,
    unicode(sys.exc_info(),“utf-8”)
    也引发了一个异常,因为
    sys.exc_info()
    返回一个元组,该元组在使用
    str()
    -方法时被正确转换为字符串,但
    unicode()
    只能处理字符串而不能处理元组。为我做这项工作的一项工作是
    unicode(str(…)


感谢所有花时间解决这个问题的人

如果catch-all异常处理未捕获此代码,则可能您未运行此代码,或者生产中的异常发生在try块之外。500甚至可能是由于python之外的错误造成的


在这段代码中引入一个故意的错误,看看您是否看到生产中的行为发生了变化。这至少可以排除运行过时代码的可能性。

如果捕获所有异常处理未捕获此代码,则可能是您未运行此代码,或者生产中的异常发生在
try
块之外。500甚至可能是由于一个完全超出python的错误造成的。在这段代码中引入一个故意的错误,看看您是否看到生产中的行为发生了变化。这至少可以排除运行过时代码的可能性。谢谢@MartijnPieters!我引入了ZeroDevisionError和-tadaa-相同的行为。这启发我从另一个角度检查异常处理——长话短说,发现了另一个编码问题。我会在问题的答案中更详细地解释。顺便问一下:现在可以结束悬赏并将50分捐赠给@MartijnPieters吗?我必须发布一个答案,然后你可以将悬赏奖励给这个人。如果您想这样做,请将我的评论作为答案转发给您。:-)是的,这意味着异常确实在
try
块之外。感谢您重新发布作为答案!尽管我在下面的答案中找到了完整的解决方案(因此,如果有人遇到类似的问题,请向下滚动一点),但我认为这是“接受的”,因为这有助于我找到解决方案;您的问题在于
try
块之外的新异常。