django manage.py如何在sys.path中放置一个工程包
我阅读了django文档和一些SO帖子,以了解manage.py和django-admin.py之间的区别。
他们都说:
manage.py会在每个Django项目中自动创建。 manage.py是django-admin.py的一个简单包装,在委托给django-admin.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是从这些位置初始化的:
安装相关的默认值必须是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中”,但是通过成为项目的根本来间接。
上一篇: How does django manage.py put a project package on sys.path