繁体   English   中英

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

[英]Run custom Django management command over SSH

我在其中一个应用程序中有一个带有自定义管理命令的Django应用程序。 如果我通过SSH登录,则可以正常运行

python manage.py sitedir / mycommand

但是,如果我尝试像这样从本地框作为单行运行命令:

ssh myserver python 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脚本运行此admin命令,但是直到我可以通过ssh one-liner使其运行,我才认为这是不可能的。 通过ssh一线运行它时,环境中是否存在某些与众不同的东西? 在这两种情况下,python路径似乎都是正确的。

我想我知道发生了什么事。 我还不知道如何解决。

为了重现您的方案,我编写了一个小脚本。

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

之后,我通过SSH和远程ssh yourserver.com "python /home/me/script.py"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

这可能是因为未加载.profile文件。 尝试以下操作(将.profile替换为您的shell配置文件):

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

您可以尝试在manage.py中尝试sys.path的mysite路径吗? 它可能会有所帮助-正如我现在所看到的,python没有看到mysite目录。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM