我有以下 django 管理命令:
fabric测试.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
在创建超级用户时)。
来自文档:
根据 POSIX,未调用 setlocale(LC_ALL, “”) 的程序使用可移植的“C”语言环境运行。调用 setlocale(LC_ALL, “”) 可使其使用 LANG 变量定义的默认语言环境。由于我们不想干扰当前的语言环境设置,因此我们以上述方式模拟行为…
…如果无法确定值,则代码和编码可以为 None。
如果您的程序无法使用该'C'
语言环境运行,请调用setlocale()
和/或设置适当的环境变量,例如LANG
。