これを serverfault または stackoverflow の下に投稿する必要があるかどうかはわかりません。それが私のサーバーのロケールの問題なのか、それとも動作しているのが python なのか OpenERP アプリケーションなのかはわかりません。
私は OpenERP システムを使用していますが、非常に奇妙な問題に遭遇しました。
openERP モジュールには、さまざまな開発者がアプリケーションのデバッグに使用した「印刷」行がいくつかあります。
次のように:
print "Value: %s" % variable
と
print "Value: " + str(variable)
通常のターミナルで OpenERP を起動すると、フォアグラウンドで正常に実行され、デバッグ ログとコンソールに出力されます。アプリケーションで例外が発生することはありません。
では問題に!
前に、アプリケーションを実行している間、アプリケーションを切り離してサーバーへの接続を閉じることができるように、画面でアプリケーションを開始しました。
「画面」で実行すると、コードは例外をスローしません
画面の代わりに init.d スクリプトが必要です。私はこのスクリプトを作成しました:
#!/bin/sh
# Configuration variables for openerp
DAEMON="/opt/openerp-server-6.0.3/bin/openerp-server.py"
ARGS="--config=/opt/openerp-server-6.0.3/openerp-server.conf"
NAME="openerp"
USER="openerp"
DESC="openerp"
PIDFILE="/var/run/$NAME.pid"
# Startup alternatives
case "$1" in
start)
echo "Starting ${DESC}"
start-stop-daemon --start --background --pidfile $PIDFILE --chuid $USER --make-pidfile --exec $DAEMON -- $ARGS
;;
stop)
echo "Stopping ${DESC}"
start-stop-daemon --stop --quiet --pidfile /var/run/${NAME}.pid --oknodo
echo "${NAME}."
;;
*)
echo "Usage: start|stop"
;;
esac
スクリプトが機能し、サーバーを起動および停止します。
Excel ファイルからデータをインポートするモジュールを使用すると、この例外が発生します。また、スウェーデン文字「åäö」を含む文字列を出力しようとするコードの他の場所でも例外が発生します。
UnicodeEncodeError: 'ascii' コーデックは位置 3 の文字 u'\xe4' をエンコードできません: 序数が範囲内にありません(128)
ロケールか何かを変更したのは「start-stop-daemon」コマンドの何かだと思いました。したがって、引数「--background」を使用してアプリケーションを強制的にバックグラウンドにする代わりに、次のことを試しました。
start-stop-daemon --start --pidfile $PIDFILE --chuid $USER --make-pidfile --exec $DAEMON -- $ARGS &> /dev/null
これにより、UnicodeEncodeError が解決されました。私が思ったすべての喜び。しかし!
入出力エラーが発生するようになりました
IOError: [Errno 5] Input/output error
そして、これを生成するコード
print pay_order
「pay_order」変数は、「åäö」を含む場合がある文字列です。
なぜこのような振る舞いをするのか理解できません。