Остановить скрипт python без потери данных - программирование
Подтвердить что ты не робот

Остановить скрипт python без потери данных

Мы запускаем скрипт на партнерском компьютере в течение 18 часов. Мы недооценили, сколько времени потребуется, и теперь нужно включить результаты. Можно ли остановить запуск сценария, но все же иметь доступ ко всем спискам, которые мы создаем?

Нам нужно добавить дополнительный код к тому, который мы сейчас запускаем, который будет использовать списки, которые сейчас заполняются. Есть ли способ остановить процесс, но все еще использовать (что было создано) списков в следующей части кода?

Мой партнер использовал python в интерактивном режиме.


Обновить

Мы смогли успешно распечатать результаты и скопировать и вставить после прерывания программы с помощью control-C.

4b9b3361

Ответ 1

Ну, OP, похоже, больше не нуждается в ответе. Но я все равно отвечу, если кто-то еще придет на это.
Хотя верно, что остановка программы приведет к удалению всех данных из памяти, которые вы все еще можете сохранить. Вы можете ввести сеанс отладки и сохранить все, что вам нужно, прежде чем вы убьете процесс.

И PyCharm, и PyDev поддерживают прикрепление своего отладчика к запущенному приложению python.
См. Здесь объяснение, как это работает в PyCharm.
Как только вы присоедините отладчик, вы можете установить контрольную точку в своем коде, и программа остановится, когда она попадет в эту строку в следующий раз. Затем вы можете проверить все переменные и запустить некоторый код с помощью функции "Оценить". Этот код может сохранить любую переменную, в которой вы нуждаетесь.

Я проверил это с PyCharm 2018.1.1 Community Edition и Python 3.6.4.

Для этого я запустил этот код, который я сохранил как test.py

import collections
import time

data = collections.deque(maxlen=100)
i = 0
while True:
    data.append(i % 1000)
    i += 1
    time.sleep(0.001)

с помощью команды python3 test.py из внешнего экземпляра Windows PowerShell. Затем я открыл этот файл в PyCharm и подключил отладчик. Я установил точку останова в строке i += 1 и она остановилась прямо там. Затем я оценил следующий фрагмент кода:

import json
with open('data.json', 'w') as ofile:
    json.dump(list(data), ofile)

И нашел все записи из data в json файле data.json.


Следовать за:
Это даже работает в интерактивном сеансе! Я запустил тот же код в ячейке ноутбука jupyter, а затем подключил отладчик к ядру. Все еще имея test.py open, я снова установил точку останова в той же строке, что и раньше, и ядро остановилось. Затем я мог видеть все переменные из сеанса интерактивного ноутбука.

Ответ 2

Я так не думаю. Остановка программы также должна освободить всю память, которую она использовала.

edit: См. комментарий Swenzel для одного из способов сделать это.