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