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

17
我在我的Django项目中创建了一个名为bin的子目录,我想把所有命令行运行的Python脚本放在那里。其中一些脚本需要导入位于bin的父目录中的Django项目settings.py文件。
如何从项目的子目录中导入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个回答

16

我认为你的方法可能把 Django 1.x 已经为你提供的功能搞得太复杂了。只要你的项目在 python path 中,你可以在脚本顶部设置环境变量 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,这也给了你一个很好的位置来获取activate脚本。等等。

那么你的项目目录上面的目录必须在Python路径中?并且持有settings.py的项目目录必须始终具有相同的目录名称?我的开发项目名称与生产名称不同,在生产中,目录名称带有时间戳。 - MikeN
我们将设置放在 /var/this 目录下,应用程序放在 /opt/that 目录下。我们的 PYTHONPATH 是 "/var/this:/opt/that"。设置与应用程序是分开的。 - S.Lott
在上面的例子中,'myproject'包必须在Python路径上,但这对于Django也是必须的。我的方法可以在您的开发环境中工作,但不确定如何进行调整以处理时间戳。 - Joe Holloway
@S.Lott 这也是我们的做法。 - Joe Holloway
@S.Lott 这是给 @MikeN 的回答,他说他的 "生产环境中的目录名带有时间戳",这表明他正在尝试发明一个通用解决方案,避免了需要知道 settings.py 路径的需求。我对他的 web 服务器配置的问题应该能够解释清楚那到底是什么。 - Joe Holloway
显示剩余2条评论

10

这比你的问题要高级一点,但也许在这里最好的解决方案是将你的脚本实现为自定义 manage.py (django-admin.py) 命令。这样做可以免费获得 Django 的全部功能(包括设置),而不需要丑陋的路径操作,同时还可以使用命令行选项解析等便利功能。我从未见过其他编写 Django 相关命令行脚本的好方法。


谢谢你的答复,我之前太懒了,没去查添加管理命令,但这正是我想要做的,并有助于将所有脚本放在一个地方。 - MikeN

3
将父目录添加到您的路径中:
import sys
sys.path.append('../')
import settings

评论更新:

不要忘记在包含你的 settings.py 的目录中添加 __init__.py 文件。 – S.Lott


我更新了问题,即使settings.py在路径中仍然存在错误。 - MikeN
不要忘记在包含settings.py的目录中添加__init__.py文件。 - S.Lott

0
假设您的项目目录是/opt/someProject/。
其中包含以下文件:

manage.py

现在你可以把子目录放在任何地方,都没有关系。 例如,子目录可以是这样的:

/opt/someproject/dir1/dir2

现在,您需要将项目设置导入到 /opt/someProject/dir1/dir2 中

您需要设置 PYTHONPATH 变量

export PYTHONPATH=/opt/someproject/

现在,您可以从 bin 中导入模块

from someproject import bin


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接