通过SSH运行自定义Django管理命令
我有一个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 个回答
这可能是因为 .profile 文件没有被加载。你可以试试这个方法(把 .profile 替换成你的 shell 配置文件):
ssh myserver '. ~/.profile; python manage.py sitedir/mycommand'
你可以试试在manage.py文件中把mysite
这个路径加到sys.path里吗?这样可能会有帮助,因为我现在看到Python并没有识别到mysite这个文件夹。
import sys
sys.path.append('mysite_directory')
我觉得我大概明白发生了什么,但还不知道怎么解决。
为了重现你的情况,我写了一个小脚本。
#!/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