編集: 最新の PyDev バージョン (PyDev 3.4.1 以降) では、回避策は必要ありません:
つまり、PyDev はプロセスの強制終了操作でサブプロセスを適切に強制終了し、定期的なリロードをオンにしてデバッグする場合でも、PyDev はデバッガーを子プロセスにアタッチします。
古い回答 (3.4.1 より古い PyDev バージョンの場合):
残念ながら、PyDev は単純に親プロセスを強制終了する (つまり、タスク マネージャーで ctrl+C の代わりに親プロセスを強制終了するかのように) ため、これは予想どおりです。
解決策は、Django自体を編集して、子プロセスが親プロセスをポーリングして、それがまだ生きていることを認識し、そうでない場合は終了するようにすることです...参照:親が終了した後に子プロセスを停止させる方法? 参考までに。
ざっと見てみると、django/utils/autoreload.py とそれが起動する方法に関連しているように見えます。そのため、親が生きているかどうかを確認し続けるスレッドを開始する必要があり、そうでない場合はそれを強制終了します。子プロセス -- Django 自体のバグとして報告しました: https://code.djangoproject.com/ticket/16982
注: PyDev の回避策として、PyDev から実行している間に Django に (PyDev から) 新しいコンソールを割り当てさせることができます (したがって、Django から適切なソリューションが利用可能になるまで、以下のパッチを使用して Django の自動リロード割り当てを行うことができます)。新しいコンソール -- 適切に 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