2012-08-28 51 views
0

得到默認的語言環境,我有以下Django的管理命令:面料,不能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)。

+0

運行本地manage.py時可能會使用'/ home/user/env/bin/python',因爲它可能不一樣。你也在同一臺遠程服務器上? – Morgan

+0

當我從服務器本地運行'manage.py'時,我實際上使用了virtualenv的python bin。我將編輯問題以使其更加明確。 這兩種情況都是完全相同的服務器,我第一次在本地運行(通過ssh進入服務器),第二次遠程運行它(使用光纖連接到服務器)。 –

+0

它的工作原理是:'run(「LANG = en_US.UTF-8/home/user/env/bin/python manage.py fabrictest」)'? – jfs

回答

0

看着this question看起來好像是挑選了環境變量。

您可以手動導出它們,無論是在run()還是使用prefix()上下文管理器。您也可以嘗試在run()中將pty設置爲False。

0

the docs來自:

根據POSIX,一個還沒有所謂的setlocale程序(LC_ALL, 「」)運行使用便攜式 'C' 語言環境。調用setlocale(LC_ALL,「」) 可以讓它使用LANG變量定義的默認語言環境。由於 我們不想與當前的區域設置,我們因此 仿效上述方式的行爲......

...代碼和編碼干擾可無的情況下,該值不能 確定。

如果程序中使用'C'地方不能運行,那麼調用setlocale()和/或設置適當的環境變量例如,LANG