django manage.py如何在sys.path中放置一个工程包

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

他们都说:

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

  • 它把你的项目的包放在sys.path中。
  • 它设置DJANGO_SETTINGS_MODULE环境变量,以便它指向项目的settings.py文件。
  • 所以我检查了这两个文件的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上的代码?


    sys.path在这里使用位于这里的handle_default_options(options)语句来更新。 执行路径如下所示:

  • execute_from_command_line(argv) (你的manage.py
  • utility.execute()在这里
  • handle_default_options(options)在这里
  • Command类用作管理命令的基类时使用了相同的方法。


    从我所看到的不是./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中”,但是通过成为项目的根本来间接。

    链接地址: http://www.djcxy.com/p/59781.html

    上一篇: How does django manage.py put a project package on sys.path

    下一篇: upgrading python django project 1.3 to 1.5