我创建了一个名为bin
的Django项目的子目录,其中我想放置所有命令行运行的Python脚本。其中一些脚本需要导入位于settings.py
父目录中的Django项目bin
文件。
如何从项目的子目录中导入settings.py
文件?
我在命令行脚本中使用的代码设置为项目的“Django上下文”:
from django.core.management import setup_environ
import settings
setup_environ(settings)
如果脚本位于项目的根目录中,则此方法可以正常工作。
我尝试了以下两个黑客来导入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
答案 0 :(得分: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,这也为您提供了一个获取激活脚本的好地方。
等。等
答案 1 :(得分:10)
这比您的问题提高了一级,但这里最好的解决方案可能是将您的脚本实现为custom manage.py (django-admin.py) commands。这将免费提供Django的所有功能(包括设置),没有丑陋的路径攻击,以及选项解析等命令行细节。我从未见过以任何其他方式编写与Django相关的命令行脚本的充分理由。
答案 2 :(得分:2)
将父目录添加到路径中:
import sys
sys.path.append('../')
import settings
从评论中更新:
不要忘记
__init__.py
文件 你的目录 settings.py - S.Lott
答案 3 :(得分:0)
假设您的项目目录为/ opt / someProject /`
其中包含以下文件:
manage.py
现在,您可以将子目录放在任何位置,没关系。 例如。子目录可能像:
/opt/someproject/dir1/dir2
现在,您可以将项目设置导入/ opt / someProject / dir1 / dir2
您需要设置PYTHONPATH变量
导出PYTHONPATH = / opt / someproject /
现在可以从bin导入模块
从someproject导入容器中