通过SSH运行自定义Django管理命令

1 投票
3 回答
2272 浏览
提问于 2025-04-16 04:00

我有一个Django应用程序,其中有一个自定义的管理命令。在通过SSH登录后,我可以顺利运行这个命令,命令是:

python manage.py sitedir/mycommand

但是,如果我尝试从我的本地电脑用一行命令来运行它,像这样:

ssh myserver python manage.py sitedir/mycommand

我就会遇到一个导入错误,内容像这样:

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的路径都是正确的。

3 个回答

0

这可能是因为 .profile 文件没有被加载。你可以试试这个方法(把 .profile 替换成你的 shell 配置文件):

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

你可以试试在manage.py文件中把mysite这个路径加到sys.path里吗?这样可能会有帮助,因为我现在看到Python并没有识别到mysite这个文件夹。

import sys
sys.path.append('mysite_directory')
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

撰写回答