Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django manage.py如何将项目包放在sys.path上_Python_Django - Fatal编程技术网

Python django manage.py如何将项目包放在sys.path上

Python django manage.py如何将项目包放在sys.path上,python,django,Python,Django,我阅读了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代码(最新版本,

我阅读了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代码(最新版本,所以它是文档)

    那我就糊涂了
    manage.py
    做第二件事:设置DJANGO\u SETTINGS\u 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上的代码在哪里?

    使用
    handle\u default\u options(options)
    语句更新
    sys.path
    。执行路径如下所示:

    • 从命令行(argv)执行(您的
      manage.py
    • utility.execute()
    • handle\u default\u选项(选项)

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

    从我所看到的,不是
    /manage.py
    将项目的包放在sys.path上

    说:

    sys.path从以下位置初始化:

    • 包含输入脚本的目录(或未指定文件时的当前目录)
    • PYTHONPATH(目录名列表,语法与shell变量PATH相同)
    • 与安装相关的默认设置
    依赖于安装的默认值必须是添加的值。但是可以使用
    -S
    开关禁用它。现在,当我运行这个脚本(
    1.py
    )时:

    我得到:

    $ 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上”,但间接地说,是因为它是项目的根目录。

    我知道这是一篇非常古老的文章,我们现在在Django 1.10上,但是基于上面的代码,只有当用户给出
    --pythonpath
    选项时,才会设置Python路径。因此,在没有给出选项的情况下,必须设置Python路径,这就是问题所要问的情况。顺便说一句,在Django 1.10中也是如此。这是正确的答案。因为,如果您放置
    导入pdb;pdb.set_trace()
    紧跟在
    之后,如果在
    manage.py
    中的
    中的
    的并选中
    sys.path
    ,您会看到路径已经设置到包含
    manage.py
    的目录,即输入脚本。
    $ 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']