Edit: последние версии PyDev (начиная с PyDev 3.4.1) больше не нуждаются в обходном пути:
Т.е.: PyDev будет корректно уничтожать подпроцессы при выполнении операции уничтожения, а при отладке даже при обычной перезагрузке PyDev подключит отладчик к дочерним процессам.
Старый ответ (для версий PyDev старше 3.4.1):
К сожалению, это ожидаемо, так как PyDev просто уничтожит родительский процесс (т. Е. Как будто вместо Ctrl + C вы уничтожите родительский процесс в диспетчере задач).
Решением будет редактирование самого Django так, чтобы дочерний процесс опрашивал родительский процесс, чтобы узнать, что он все еще жив, и завершать работу, если он не ... см .: Как заставить дочерний процесс умереть после выхода из родительского процесса? для справки.
После быстрого просмотра он кажется связанным с django / utils / autoreload.py и тем, как он запускает вещи - так что нужно будет запустить поток, который продолжает видеть, жив ли родитель, а если нет, то это убивает дочерний процесс - я сообщал об этом как об ошибке в самом Django: https://code.djangoproject.com/ticket/16982
Примечание: в качестве обходного пути для PyDev вы можете заставить Django выделить новую консоль (вне PyDev), все еще работая из 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