我正在使用django进行一些测试,但我遇到的问题似乎是我的__init __的双重执行._。py。
为什么要执行两次?
示例:
$ ./manage.py runserver 0.0.0.0:9000
Trying import local.py settings...
Trying import development.py settings...
Trying import local.py settings...
Trying import development.py settings...
Performing system checks...
System check identified no issues (0 silenced).
November 06, 2015 - 10:13:51
Django version 1.8.6, using settings 'settings'
Starting development server at http://0.0.0.0:9000/
Quit the server with CONTROL-C.
文件树:
$ tree -I '*.pyc'
.
├── db.sqlite3
├── manage.py
└── settings
├── development.py
├── __init__.py
├── local.py.example
├── __pycache__
├── urls.py
└── wsgi.py
manage.py文件:
$ more manage.py
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
settings / __ init___.py文件:
$ more settings/__init__.py
from __future__ import absolute_import, print_function
import os, sys
try:
print("Trying import local.py settings...", file=sys.stderr)
from .local import *
except ImportError:
print("Trying import development.py settings...", file=sys.stderr)
from .development import *
此致
答案 0 :(得分:2)
Django的manage.py runserver
默认从主进程分配子进程。
如果您向print('PID:', os.getpid(), 'Parent PID:', os.getppid())
添加__init__.py
,您会看到每行获得2个数字,PID和父线程PID。
输出应该或多或少看起来像这样:
PID: 31019 Parent PID: 30633
PID: 31020 Parent PID: 31019
您在此处看到的内容如下:
30633 = shell PID。
31019 = manage.py runserver父进程。
31020 = manage.py runserver子进程。
原因实际上在于默认的runserver行为,使用重新加载器。它的作用基本上是将manage.py runserver作为父进程启动。如果你没有指定--noreload选项,那么它将产生一个子manage.py runserver
进程。
执行此操作后,父运行服务器将跟踪代码更改,以便它可以终止并重新加载子进程。
如果您运行manage.py runserver --noreload
,您将看到只有一行PID,父PID。
有关此内容的更多信息,您可以深入了解位于django.core.management.commands中的Django的runserver命令