Есть ли способ получить локальную переменную из работающей функции?

Отчаянный. Скажем, у нас есть следующее:

def main():
 ALotOFCode
 list1 = []
 list2 = []
 while condition:
  # a lot of times where raw_input is used in this loop
  # e.g. 
  x = raw_input('lots of steps to compute x')
  y = raw_input('lots of steps to compute y')  
  list1 = list1.append(x)
  list2 = list2.append(y)
  stream.write({'x':list1,'y':list2}) #send new data point to plot.ly via raspberry pi

Я не знаю, что случилось. Но мой сюжет в plot.ly пропал. Удалил полностью. Я возился с тем, что у меня было на графике до сих пор на моем ПК, а затем я продолжил вводить данные и строить график из raspberry pi. Я мог видеть, что сюжет строится без проблем. Затем я вернулся к своему ПК и нажал «Обновить». Участок и все данные исчезли. Вернулся к малине. Уже синхронизировано. Прошло.

Я знаю, что list1 и list2 прямо сейчас, когда я пишу это, содержат все данные, которые мне нужны для переделки моего сюжета. Но есть ли вообще способ получить к нему доступ и сохранить в файл? Моя оболочка Python в настоящее время ожидает ввода через raw_input, поэтому я не могу использовать оболочку. Есть ли способ, которым я могу перейти к переменным, которые в настоящее время находятся в области все еще работающей программы? Очевидно, что после завершения программы локальные переменные удаляются.

Конечно, если история сохраняется для каждого сюжета на plot.ly, это поможет, но я не могу найти какой-либо вариант восстановления в предыдущее состояние.

Обновление: Итак, слава богу, я сохранил результаты некоторых промежуточных шагов в файл. Я фактически отказался от попыток получить доступ к переменной и вместо этого попытался сгенерировать list1 и list2 с помощью нового сценария "на лету". В 8:30 утра у меня были данные, а в 10:00 мой руководитель с радостью посмотрел на них, ничего не думая. Этот вопрос остается открытым, хотя пока никто не дал четкого ответа и не объяснил, почему прямой доступ к list1 и list2 невозможен. (Я просмотрел каждое предложение в комментариях, но не смог найти ничего, что дало бы ответ)

Обязательный заключительный комментарий: моя вера в Plot.ly пошатнулась, по крайней мере, на какое-то время.


person Frikster    schedule 07.08.2015    source источник
comment
Я серьезно сомневаюсь, что можно сделать то, о чем вы просите, каким-либо разумным или безопасным способом. Если я правильно вас понимаю.   -  person kylieCatt    schedule 07.08.2015
comment
См. присоединение процесса с помощью pdb. Боюсь, выглядит не очень.   -  person Peter Wood    schedule 07.08.2015
comment
возможно, вы можете использовать tcpdump для захвата вывода при записи потока (если это сетевой поток).   -  person gauteh    schedule 07.08.2015


Ответы (1)


Чтобы иметь возможность «читать» внутренние переменные для целей отладки, я вижу следующие идеи:

  1. создайте файл журнала со строкой для каждого изменения переменной и перед каждой функцией блокировки. Даже если бревно огромное. А дальше лог с "хвостом" на Raspberry (новая консоль или новое удаленное подключение).

  2. Преобразуйте переменные, чтобы они были глобальными, и добавьте код, который выводит все переменные на стандартный вывод при нажатии специальной клавиши, например, Ctrl+C, которая прерывает почти все. Если преобразование переменных в глобальные невозможно (например, из-за вложенных вызовов), создайте новые переменные, содержащие последние известные значения.

Обработка Ctrl+C может быть выполнена следующим образом (из здесь):

#!/usr/bin/env python
import signal
import sys
def signal_handler(signal, frame):
        print('You pressed Ctrl+C!')
        sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print('Press Ctrl+C')
signal.pause()

Как видите, мои варианты подразумевают модификацию кода, чтобы сделать его болтливым или доступным для запросов.

person Elo    schedule 11.08.2015