0

次のdjango管理コマンドがあります:

fabrictest.py

from django.core.management.base import NoArgsCommand
import locale

class Command(NoArgsCommand):

    def handle_noargs(self, **options):
        print locale.getdefaultlocale()

ローカルで実行できるもの:

$ /home/user/env/bin/python manage.py fabrictest
('en_US', 'UTF-8')

ただし、次のファブリック タスクを使用してコマンドをリモートで実行すると、

@task
def test():
    # run manage.py using the python bin from the virtualenv

    with cd(env.project_root):
        run("/home/user/env/bin/python manage.py fabrictest")

次の出力が得られます

[server] Executing task 'test'
[server] run: /home/user/env/bin/python manage.py fabrictest
[server] out: (None, None)

(None, None)代わりに?を取得するのはなぜ('en_US', 'UTF-8')ですか。これにより、他の管理スクリプト (つまり、syncdbスーパーユーザーの作成時) でエラーが発生します。

4

2 に答える 2

0

ドキュメントから:

POSIX によると、setlocale(LC_ALL, "") を呼び出していないプログラムは、移植可能な 'C' ロケールを使用して実行されます。setlocale(LC_ALL, "") を呼び出すと、LANG 変数で定義されたデフォルトのロケールを使用できます。現在のロケール設定に干渉したくないので、上記の方法で動作をエミュレートします...

...コードとエンコーディングは、値を特定できない場合に備えて None にすることができます。

'C'ロケールを使用してプログラムを実行できない場合は、setlocale()適切な環境変数を呼び出すか、または設定しますLANG

于 2012-08-28T22:03:25.040 に答える
0

この質問を見ると、それらは環境変数を取得しているようです。

run() または prefix() コンテキストマネージャーを使用して、手動でエクスポートできます。run() で pty を False に設定することもできます。

于 2012-08-28T18:06:56.703 に答える