PyDev 和 Django:如何重启开发服务器?

Posted

技术标签:

【中文标题】PyDev 和 Django:如何重启开发服务器?【英文标题】:PyDev and Django: how to restart dev server? 【发布时间】:2011-02-14 08:20:19 【问题描述】:

我是 Django 新手。我想我犯了一个简单的错误。

我用 Pydev 启动了开发服务器:

R点击项目 >> Django >> 自定义 命令>>运行服务器

服务器启动了,一切都很好。但现在我试图阻止它,但不知道如何。我在 PyDev 控制台中停止了该进程,并关闭了 Eclipse,但仍然从 http://127.0.0.1:8000 提供网页。

我从命令行正常启动和退出服务器:

python manage.py runserver

但服务器仍在运行。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

我通常从控制台运行它。从 PyDev 运行会增加不必要的混乱,并且在您碰巧使用 PyDev 的 GUI 交互式调试之前不会带来任何好处。

【讨论】:

【参考方案2】:

解决方案:在某些项目文件中创建解释器错误。这将导致服务器崩溃。然后可以正常重启服务器。

【讨论】:

我想知道您是否可以称其为优雅的解决方案。这很简单,而且很有效。【参考方案3】:

默认情况下,runserver 命令以自动重载模式运行,该模式在单独的进程中运行。这意味着 PyDev 不知道如何停止它,也不会在控制台窗口中显示其输出。

如果您改为运行命令runserver --noreload,则自动重新加载器将被禁用。然后就可以看到控制台输出并正常停止服务器了。但是,这意味着在您手动重新启动服务器之前,对 Python 文件的更改不会生效。

【讨论】:

【参考方案4】:

编辑:最新的 PyDev 版本(自 PyDev 3.4.1 起)不再需要任何解决方法:

即:PyDev 将在终止进程操作时正确终止子进程,即使在定期重新加载的情况下进行调试时,PyDev 也会将调试器附加到子进程。


旧答案(适用于 3.4.1 之前的 PyDev 版本):

不幸的是,这是意料之中的,因为 PyDev 会简单地杀死父进程(即:就好像你在任务管理器中杀死父进程而不是 ctrl+C)。

解决方案是编辑 Django 本身,以便子进程轮询父进程以知道它仍然存在,如果不存在则退出......请参阅:How to make child process die after parent exits? 以获取参考。

快速浏览后,它似乎与 django/utils/autoreload.py 以及它启动事物的方式有关——因此,需要启动一个线程来不断查看父节点是否还活着它会杀死子进程——我已经将其报告为 Django 本身的一个错误:https://code.djangoproject.com/ticket/16982

注意:作为 PyDev 的一种解决方法,您可以让 Django 分配一个新的控制台(在 PyDev 之外),同时仍然从 PyDev 运行(因此,在 Django 提供适当的解决方案之前,可以使用下面的补丁来使Django autoreload 分配了一个新的控制台——你可以在其中正确使用 Ctrl+C)。

Index: django/utils/autoreload.py
===================================================================
--- django/utils/autoreload.py  (revision 16923)
+++ django/utils/autoreload.py  (working copy)
@@ -98,11 +98,14 @@
 def restart_with_reloader():
     while True:
         args = [sys.executable] + ['-W%s' % o for o in sys.warnoptions] + sys.argv
-        if sys.platform == "win32":
-            args = ['"%s"' % arg for arg in args]
         new_environ = os.environ.copy()
         new_environ["RUN_MAIN"] = 'true'
-        exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ)
+
+        import subprocess
+        popen = subprocess.Popen(args, env=new_environ, creationflags=subprocess.CREATE_NEW_CONSOLE)
+        exit_code = popen.wait()
         if exit_code != 3:
             return exit_code

【讨论】:

【参考方案5】:

如果您使用 CMD 在 Windows 上操作:使用 CTRL+BREAK 退出服务器。

python manage.py runserver localhost:8000

【讨论】:

【参考方案6】:

运行项目 1. 右键单击​​项目(不是子文件夹) 2. 运行方式 > Pydev:Django

终止 1. 在控制台窗口中单击终止

服务器宕机

【讨论】:

这可行,虽然“终止”是右侧的红色框,然后您必须重新启动服务器才能看到任何更改。 很好的解决方案,如果它不起作用,请尝试重新启动计算机/eclipse 并确保仅以这种方式启动服务器。将此与“runserver”自定义命令混合使用可能会阻止服务器正常停止。【参考方案7】:

您可以通过单击Ctrl+ Pause 键退出。请注意,暂停键可能称为Break,在某些笔记本电脑中,它是使用Fn + F12 组合而成的。希望这可能会有所帮助。

【讨论】:

以上是关于PyDev 和 Django:如何重启开发服务器?的主要内容,如果未能解决你的问题,请参考以下文章

JDK1.7+eclipse 4.4(luna)+pydev4.4.5构建django开发环境

python的开发环境配置-Eclipse-PyDev插件安装

如何卸载eclipse中的pydev

pydev 无法识别带有 django 的 python 安装

python 集成开发环境哪个好

python 集成开发环境哪个好