3

subprocess.CalledProcessErrorApache を実行しているプロダクション サーバーで Django プロジェクトを実行すると、奇妙な問題が発生します。

私のコード(更新:catch-all-exception処理が追加されました-動作は変更されていません)は次のとおりです。

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) に移動すると、コマンドの実行が失敗したときに「Internal Server Error 500」が発生しますが、これは望ましい動作ではありません。Apache の error.log にはエラーが表示されないため、あまり役に立ちません。

私の構成は次のとおりです。 Apache/2.2.22 (Ubuntu) PHP/5.4.9-4ubuntu2.3 mod_wsgi/3.4 Python/2.7.4

(はい、Apache を再起動しましたが、同じコードで実行していると確信しています)。

これに関するアイデアはありますか?

4

2 に答える 2

3

キャッチオール例外処理がこれをキャッチしていない場合は、このコードを実行していないか、本番環境で 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")ため、例外が発生することですが、タプルではなく文字列のみを処理できます。私のために仕事をした1つの回避策は.sys.exc_info()str()unicode()unicode(str(...))

この問題を解決するために時間を割いてくださった皆さん、ありがとうございました!

于 2013-10-17T11:24:59.007 に答える