如何从子目录导入Django项目settings.py Python文件?

时间:2009-03-06 20:42:12

标签: python django

我创建了一个名为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

4 个答案:

答案 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导入容器中