3

I have a strange problem with subprocess.CalledProcessError when running my Django-project on a production server running Apache:

My code (UPDATE: added catch-all-exception handling - behaviour is unchanged) is as follows:

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

This is all working as expected when I run it on my Windows development machine and the djange testserver. The exception is caught when the command execution fails, the error handling works as expected.

When I move the code to my production server (ubuntu, apache), I get an "Internal Server Error 500" when the command execution fails which is not the desired behaviour. The apache error.log is not very helpful since it does not show any error.

My configuration is: Apache/2.2.22 (Ubuntu) PHP/5.4.9-4ubuntu2.3 mod_wsgi/3.4 Python/2.7.4

(Yes, I restarted apache and I'm sure I run on the same code).

Any ideas on this one?

4

2 回答 2

3

如果 catch-all 异常处理没有捕捉到这个,那么要么你没有运行这个代码,要么生产中的异常发生在 try 块之外。500 甚至可能是由于完全在 python 之外的错误。

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

于 2013-10-17T13:45:13.573 回答
2

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

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

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

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

于 2013-10-17T11:24:59.007 回答