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插件安装