2010-09-11 104 views
1

我有一個Django應用程序在其中一個應用程序中具有自定義管理命令。如果我通過SSH登錄,我可以不與通過SSH運行自定義Django管理命令

蟒蛇manage.py sitedir任何問題,但是運行/ mycommand的

,如果我嘗試從我喜歡的本地框運行命令爲oneliner這樣的:

SSH MYSERVER蟒蛇manage.py sitedir/mycommand的

我得到這樣一個ImportError:

Traceback (most recent call last): 
    File "mysite/manage.py", line 11, in <module> 
    execute_manager(settings) 
    File "/usr/lib/python2.5/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/usr/lib/python2.5/site-packages/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/lib/python2.5/site-packages/django/core/management/__init__.py", line 261, in fetch_command 
    klass = load_command_class(app_name, subcommand) 
    File "/usr/lib/python2.5/site-packages/django/core/management/__init__.py", line 67, in load_command_class 
    module = import_module('%s.management.commands.%s' % (app_name, name)) 
    File "/usr/lib/python2.5/site-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
ImportError: No module named mysite.myapp.management.commands.mycommand 

真正的原因是我想從Fabric腳本運行此管理命令,但直到我可以通過ssh單線程運行它,我想這是不可能的。當你通過ssh單線程運行它時,環境中是否有不同的東西? python路徑在兩種情況下似乎都是正確的。

回答

1

我想我有一個線索是怎麼回事。我不知道如何解決它。

要重現您的場景,我寫了一個小腳本。

#!/usr/bin/python 
import sys, django 
print django.VERSION 

這之後,我執行它通過SSH登錄以及遠程(ssh yourserver.com "python /home/me/script.py")後,一切都很好。

然後我改變了腳本。

#!/usr/bin/python 
import os 
print os.environ['DJANGO_SETTINGS_MODULE'] 

此版本的工作時,我登錄到服務器,但失敗當我試圖遠程執行它。

Traceback (most recent call last): 
    File "/home/me/script.py", line 3, in <module> 
    print os.environ['DJANGO_SETTINGS_MODULE'] 
    File "/usr/lib/python2.5/UserDict.py", line 22, in __getitem__ 
    raise KeyError(key) 
KeyError: 'DJANGO_SETTINGS_MODULE' 

很顯然,當你通過SSH遠程執行命令的DJANGO_SETTINGS_MODULE環境變量未設置。我懷疑這是可能是什麼問題在你的情況。在執行腳本之前,您需要弄清楚如何確保這個變量是正確設置的。

也許你可以明確地設置它: os.environ['DJANGO_SETTINGS_MODULE'] = 'foo'

試試這個:

ssh yourserver.com "python /home/me/script.py" -t 
    DJANGO_SETTINGS_MODULE=app.settings.custom 
+0

我認爲你是在做某事。我設法通過shell腳本oneliner運行它,如下所示: cd $ PROJECTPATH && $ HOME/v/bin/python manage。py mycommand --settings = $ SETTINGS --pythonpath = $ HOME 這似乎是一個路徑相關的問題。當用戶沒有正確登錄時,環境似乎被搞砸了。感謝您花時間研究這一點。 – PeterK 2010-09-12 19:23:27

0

您可以嘗試mysite路徑manage.py到sys.path的?它可以幫助 - 正如我現在看到的python沒有看到mysite目錄。

import sys 
sys.path.append('mysite_directory') 
+0

這對我不起作用,但感覺它可能是相關的。我正在研究django-chronograph如何設置環境以查看是否有我可以複製的東西。 – PeterK 2010-09-12 17:30:51

0

這可能是因爲.profile文件未加載。試試這個(用您的shell配置文件替換.profile):

ssh myserver '. ~/.profile; python manage.py sitedir/mycommand'