django manage.py如何在sys.path上放置一个项目包

时间:2013-10-20 11:50:22

标签: python django

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

他们都说:

  

在每个Django项目中自动创建manage.py. manage.py   是一个围绕django-admin.py的薄包装器,可以处理两件事   在委托给django-admin.py之前为你服务:

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

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

然后我很困惑。第二件事是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上的代码在哪里?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

从我所看到的不是./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

因此,可以说<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <body> <div class="dropdown"> <button class="btn btn-primary dropdown-toggle" type="button" id="ddButton" data-toggle="dropdown">Button</button> <ul class="dropdown-menu" role="menu"> <li><a href="#">HTML</a></li> <li><a href="#">CSS</a></li> <li><a href="#">JavaScript</a></li> </ul> </div> </body> </body> </html>&#34;将您的项目包放在sys.path上,&#34;但间接地,通过成为项目的根源。