3

我阅读了 django文档和一些 SO 帖子以了解 manage.py 和 django-admin.py 之间的区别。

他们都说:

manage.py 在每个 Django 项目中自动创建。manage.py 是 django-admin.py 的一个瘦包装器,它在委托给 django-admin.py 之前为您处理两件事:

  1. 它将您的项目包放在 sys.path 上。
  2. 它设置 DJANGO_SETTINGS_MODULE 环境变量,使其指向您项目的 settings.py 文件。

所以我检查了这两个文件的源代码(最新版本,所以它是文档)。

然后我很困惑。manage.py做第二件事:设置 DJANGO_SETTINGS_MODULE 环境变量。除此之外,我真的找不到这两个脚本之间的任何区别。

[django-admin.py]

#!/usr/bin/env python
from django.core import management

if __name__ == "__main__":
    management.execute_from_command_line()

[管理.py]

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

为什么?django 文档是否已过时?或者我在这里错过了什么?将项目包放在 sys.path 上的代码在哪里?

4

2 回答 2

3

使用位于此处的语句在此处sys.path更新。执行路径如下:handle_default_options(options)

  • execute_from_command_line(argv)(你的manage.py
  • utility.execute() 这里
  • handle_default_options(options) 这里

Command用作管理命令的基类的类使用相同的方法。

于 2013-10-20T12:26:58.460 回答
1

据我所知,并不是./manage.py谁“将您的项目包放在 sys.path 上”。

医生说:

sys.path 从这些位置初始化:

  • 包含输入脚本的目录(或未指定文件时的当前目录)。
  • PYTHONPATH(目录名称列表,与 shell 变量 PATH 具有相同的语法)。
  • 安装相关的默认值。

依赖于安装的默认值必须是site.py添加的。但可以通过-S开关禁用。现在,当我运行此脚本(1.py)时:

import sys
print(sys.path)

我得到:

$ python -S ../1.py   # to show that it's not current directory that is added
['/path/to/the/script/directory', '/usr/lib/python35.zip', '/usr/lib/python3.5/', \
'/usr/lib/python3.5/plat-linux', '/usr/lib/python3.5/lib-dynload']

所以,当你跑的时候django-admin/path/to/env/bin/django-admin会先上sys.path。而当./manage.py/path/to/project

因此,人们可能会说./manage.py“将项目的包放在 sys.path 上”,但间接地,通过位于项目的根目录。

于 2016-11-10T08:29:15.133 回答