【问题标题】:How does django manage.py put a project package on sys.pathdjango manage.py如何把项目包放到sys.path上
【发布时间】:2013-10-28 21:51:27
【问题描述】:

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

他们都说:

manage.py 会在每个 Django 项目中自动创建。管理.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()

[manage.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 上的代码在哪里?

【问题讨论】:

    标签: python django


    【解决方案1】:

    sys.path 使用位于herehandle_default_options(options) 语句更新here。执行路径如下:

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

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

    【讨论】:

    • 我知道这是一篇非常老的帖子,我们现在使用的是 Django 1.10,但基于上面的代码,Python 路径仅在用户给出--pythonpath 选项时才设置。因此,当未给出该选项时,必须设置其他东西来设置 Python 路径,这就是问题所要问的情况。顺便提一句。在 Django 1.10 中也是如此。
    【解决方案2】:

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

    The doc 说:

    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 上”,但间接地,通过位于项目的根目录。

    【讨论】:

    • 这是正确答案。因为,如果您将import pdb; pdb.set_trace() 放在manage.py 中的if __name__ == "__main__": 之后并检查sys.path,您会看到路径已设置为包含manage.py 的目录,即输入脚本。
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 2020-04-22
    • 2015-10-18
    • 2022-07-27
    • 1970-01-01
    • 2012-05-03
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多