2010-09-11 74 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'