Запустите пользовательскую команду управления Django через SSH - PullRequest
1 голос
/ 11 сентября 2010

У меня есть приложение 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, но пока я не смогу запустить ее через однострочник ssh, я думаю, это будет невозможно. Есть ли что-то в среде, которая отличается, когда вы запускаете это через ssh one-liner? Путь Python кажется правильным в обоих случаях.

Ответы [ 3 ]

1 голос
/ 11 сентября 2010

Я думаю, что имею представление о том, что происходит. Я пока не знаю, как это исправить.

Чтобы воспроизвести ваш сценарий, я написал небольшой сценарий.

#!/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'

Очевидно, переменная окружения DJANGO_SETTINGS_MODULE не устанавливается при удаленном выполнении команды по SSH. Я подозреваю, что может быть тем, что идет не так в вашем случае. Вам нужно будет выяснить, как убедиться, что эта переменная установлена ​​правильно перед выполнением сценария.

Возможно, вы можете явно установить его: os.environ['DJANGO_SETTINGS_MODULE'] = 'foo'. .

Попробуйте это:

ssh yourserver.com "python /home/me/script.py" -t 
    DJANGO_SETTINGS_MODULE=app.settings.custom
0 голосов
/ 19 февраля 2015

Это может быть потому, что файл .profile не загружен.Попробуйте вместо этого (замените .profile на свой профиль оболочки):

ssh myserver '. ~/.profile; python manage.py sitedir/mycommand'
0 голосов
/ 11 сентября 2010

Вы можете попробовать mysite путь к sys.path в manage.py? Это может помочь - как я теперь вижу, python не видит каталог mysite.

import sys
sys.path.append('mysite_directory')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...