我创建了一个我的Django项目的子目录,bin
在那里我想放置所有命令行运行的Python脚本.其中一些脚本需要导入我settings.py
父目录中的Django项目文件bin
.
如何settings.py
从项目的子目录导入文件?
我在命令行脚本中使用的代码设置为项目的"Django上下文":
from django.core.management import setup_environ import settings setup_environ(settings)
如果脚本位于项目的根目录中,则此方法可以正常工作.
我尝试了以下两个hacks来导入settings.py
文件,然后设置项目:
import os os.chdir("..") import sys sys.path = [str(sys.path[0]) + "/../"] + sys.path
残酷的黑客可以导入settings.py
,但后来我得到错误:
project_module = __import__(project_name, {}, {}, ['']) ValueError: Empty module name
Joe Holloway.. 16
我认为你的方法可能会让Django 1.x为你提供的东西过于复杂.只要您的项目位于python路径中,就可以在脚本顶部设置环境变量DJANGO_SETTINGS_MODULE,如下所示:
import os os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
在您需要读取设置的命令行脚本中,只需像在应用程序代码中那样从'django.conf'导入设置模块:
from django.conf import settings
并且,您可以为脚本设置设置和启用Django的环境.
我个人更喜欢在名为'proj_env'的bash脚本中使用'/ usr/bin/env'设置我的DJANGO_SETTINGS_MODULE,所以我不必重复它
#!/bin/bash proj_env="DJANGO_SETTINGS_MODULE=myproject.settings" /usr/bin/env $proj_env ${*}
有了这个,现在我可以在上下文中使用我的Django应用程序运行任何python脚本:
proj_env python -m 'myproject.bin.myscript'
如果您使用virtualenv,这也为您提供了一个获取激活脚本的好地方.
等等
我认为你的方法可能会让Django 1.x为你提供的东西过于复杂.只要您的项目位于python路径中,就可以在脚本顶部设置环境变量DJANGO_SETTINGS_MODULE,如下所示:
import os os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
在您需要读取设置的命令行脚本中,只需像在应用程序代码中那样从'django.conf'导入设置模块:
from django.conf import settings
并且,您可以为脚本设置设置和启用Django的环境.
我个人更喜欢在名为'proj_env'的bash脚本中使用'/ usr/bin/env'设置我的DJANGO_SETTINGS_MODULE,所以我不必重复它
#!/bin/bash proj_env="DJANGO_SETTINGS_MODULE=myproject.settings" /usr/bin/env $proj_env ${*}
有了这个,现在我可以在上下文中使用我的Django应用程序运行任何python脚本:
proj_env python -m 'myproject.bin.myscript'
如果您使用virtualenv,这也为您提供了一个获取激活脚本的好地方.
等等
这比你的问题提高了一级,但这里最好的解决方案是将脚本实现为自定义manage.py(django-admin.py)命令.这为您提供了所有Django的免费功能(包括设置),没有任何丑陋的路径攻击,以及选项解析等命令行细节.我从未见过以任何其他方式编写与Django相关的命令行脚本的充分理由.