为什么在if __name__ == "__main__"下执行manage.py脚本会运行两次

3 投票
1 回答
1648 浏览
提问于 2025-04-17 21:46

目标: 在启动 Django 框架的时候,同时启动其他依赖于 Django 对象的 Python 脚本。并且从配置文件中获取服务器和端口号。

问题: Popen 似乎运行了两次,我不太明白为什么?

#!/usr/bin/env python
import os
import sys
import subprocess
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test.localsettings")
from django.core.management import execute_from_command_line

def getargs(): 
    try:
        f = open("config")
        data = []
        for line in f:
            data.append(line)
        f.close()
        server = data[0].rstrip()
        port = data[1]
        newargs = ['lmanage.py', 'runserver', server + ':' + port]
        return newargs

    except Exception as e:
        print e
        pass

if __name__ == "__main__":

    #Launching Checker
    try: 
        checker = subprocess.Popen([sys.executable, os.path.join(os.getcwd() + "checker.py")], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        print checker.pid
    except Exception as e:
        print e
        pass 
    print "end"

    execute_from_command_line(getargs())

输出:

16200
end
29716
end
Validating models...

这是我第一次尝试,如果有人知道更好的方法,请随时告诉我。

谢谢大家。

1 个回答

11

你的代码在运行 runserver 命令,这会让 Django 使用一个叫做 重载器 的东西。这意味着你的代码会像在命令行输入一样被重新执行。如果你在启动 runserver 时加上 --noreload,这个问题就会消失。

简单来说,那个在你修改源文件时自动重载 Django 的功能,在开发时非常有用,但现在却导致你的代码执行了两次。

撰写回答