我在其中一个应用程序中有一个带有自定义管理命令的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 one-liner运行它,我想这是不可能的。当你通过ssh one-liner运行它时,环境中有什么不同吗?在这两种情况下,python路径似乎都是正确的。
答案 0 :(得分: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
答案 1 :(得分:0)
您可以在manage.py中尝试mysite
路径到sys.path吗?它可能会有所帮助 - 正如我所看到的,现在python没有看到mysite目录。
import sys
sys.path.append('mysite_directory')
答案 2 :(得分:0)
这可能是因为未加载.profile文件。请尝试使用此替换(将.profile替换为您的shell配置文件):
ssh myserver '. ~/.profile; python manage.py sitedir/mycommand'