【问题标题】:Is there any way to retrieve a local variable from a running function?有没有办法从正在运行的函数中检索局部变量?
【发布时间】:2015-08-07 12:45:25
【问题描述】:

绝望。假设我们有以下内容:

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 中的情节已经消失了。彻底删除。到目前为止,我在我的 PC 上弄乱了我在情节上的内容,然后我继续输入数据并从树莓派构建情节。我可以看到正在建造的情节没有问题。然后我回到我的电脑并点击刷新。绘图和所有数据都消失了。回到覆盆子。已经同步了。走了。

虽然我知道现在 list1 和 list2 在我写这篇文章时包含我需要重新制作我的情节的所有数据。但是有什么办法可以访问它并将其保存到文件中吗?我的 python shell 目前正在等待通过 raw_input 输入,所以我不能使用 shell。有什么办法可以让我进入当前仍在运行的程序范围内的变量?显然,一旦程序结束,局部变量就会被删除。

当然,如果为 plot.ly 上的每个情节保存历史记录,这将有所帮助,但我找不到任何恢复到先前状态的选项。

更新:所以 - 感谢上帝 - 我已将一些中间步骤的输出保存到文件中。我实际上放弃了尝试访问该变量,而是尝试通过一个新的动态脚本生成list1list2。早上 8 点 30 分,我拿到了我的数据,上午 10 点,我的主管高兴地看着它,一点也不聪明。尽管没有人给出明确的答案或解释如何直接访问list1list2,但这个问题仍然悬而未决。 (我确实浏览了 cmets 中的每个建议,但找不到任何提供答案的内容)

强制性的最后评论:我对 Plot.ly 的信心已经破灭,至少有一段时间。

【问题讨论】:

  • 我严重怀疑是否有可能以任何理智或安全的方式完成您的要求。如果我的理解正确的话。
  • attaching a process with pdb。恐怕看起来不太好。
  • 也许您可以使用 tcpdump 在写入流时捕获输出(如果它是网络流)。

标签: python raspberry-pi2 plotly


【解决方案1】:

为了能够“读取”内部变量以进行调试,我看到了以下想法:

  1. 为每个变量更改和每个阻塞函数之前创建一个包含一行的日志文件。即使日志很大。然后在 Raspberry 上使用“tail”跟踪日志(新控制台或新远程连接)。

  2. 将变量转换为全局变量并添加一些代码,以便在按下特殊键时将所有变量输出到标准输出,例如 Ctrl+C 几乎会中断所有内容。 如果无法将变量转换为全局变量(例如由于嵌套调用的原因),请创建保存最后一个已知值的新变量。

Ctrl+C 可以这样处理(来自here):

#!/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()

如您所见,我的选项意味着修改代码以使其变得健谈或可查询。

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 2021-11-16
    • 2022-06-10
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多