【问题标题】:Run custom Django management command over SSH通过 SSH 运行自定义 Django 管理命令
【发布时间】:2011-04-11 01:29:06
【问题描述】:

我在其中一个应用程序中有一个带有自定义管理命令的 Django 应用程序。如果我通过 SSH 登录,我可以毫无问题地运行它

python manage.py sitedir/mycommand

但是,如果我尝试像这样从本地框中以 oneliner 的形式运行该命令:

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 脚本运行这个管理命令,但直到我可以通过 ssh 单线运行它之前,我想这是不可能的。当您通过 ssh one-liner 运行它时,环境中有什么不同吗?在这两种情况下,python 路径似乎都是正确的。

【问题讨论】:

    标签: python django ssh


    【解决方案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
    

    【讨论】:

    • 我认为你正在做某事。我设法通过这样的 shell 脚本 oneliner 运行它: cd $PROJECTPATH && $HOME/v/bin/python manage.py mycommand --settings=$SETTINGS --pythonpath=$HOME 之后似乎是一个与路径相关的问题全部。当用户未正确登录时,环境似乎被搞砸了。感谢您抽出宝贵时间对此进行调查。
    【解决方案2】:

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

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

    【讨论】:

    • 这对我不起作用,但感觉可能是相关的。我正在研究 django-chronograph 如何设置环境以查看是否有可以复制的内容。
    【解决方案3】:

    这可能是因为 .profile 文件未加载。试试这个(用你的 shell 配置文件替换 .profile):

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

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 2011-08-15
      • 1970-01-01
      • 2016-03-28
      • 2011-09-09
      • 1970-01-01
      • 2021-03-09
      • 2015-07-24
      • 1970-01-01
      相关资源
      最近更新 更多