¿双重执行python的__init__.py文件?

时间:2015-11-06 10:26:23

标签: python django

我正在使用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 *

此致

1 个答案:

答案 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命令