2

我有一个名为“poc.py”的脚本,它采用一个位置命令行参数“inputfile.txt”。poc.py 脚本用于argparse处理位置命令行参数,然后将 args dict 传递给main(). 进入后main(),我读取输入文件,进行一些处理,创建一个pandas DataFrame,最后绘制数据。我在操作我的 DataFrame 和控制结果图的确切格式时遇到了困难,所以我想尝试 ipython 以交互方式探索它,看看我是否可以更好地掌握处理 pandas/matplotlib 的“pythonic”方法。

所以我尝试使用 ipython 并运行一个脚本,但我无法让 ipython 保留我的脚本的命名空间。

我试过这个:

$ ipython --pylab -i poc.py inputfile.txt

它可以很好地运行我的脚本,并显示绘图(即使没有阻塞plt.show()调用),但是当脚本完成时,ipython whoandwhos命令会说Interactive namespace is empty. 同样,如果我首先进入 ipython shell,然后执行以下操作:

In [2]: run poc.py inputfile.txt

当脚本完成时(再次,大量输出,显示图)我得到相同的结果:一个空的交互式命名空间。

在理解如何运行外部和使用 ipython 以交互方式探索脚本中的数据/对象方面,我缺少什么?

这是我的脚本 ( poc.py) 设置的简单示例:

import numpy as np
import matplotlib as plt
import pandas as pd

# etc ...more libraries and custom functions here...

def main(args):
  data = np.genfromtxt(args.inputfile)

  # (omitted)...more data processing / manipulation...
  pdata = pd.DataFrame(data)

  # (omitted)...more data processing / manipulation...
  plt.plot(pdata)

  # (omitted)...some formatting of the matplotlib/axes/figure objects
  plt.show()


if __name__ == '__main__':
  parser = argparse.ArgumentParser(description='''some program...''')
  parser.add_argument('inputfile', help='path to input file')
  args = parser.parse_args()
  main(args)
4

2 回答 2

8

在这里回答自己。我知道这可能是一个评论,但我认为该描述需要一个独立的答案。

基本上,在花了一些时间了解每个人提到的关于我的变量超出范围的问题以及处理该问题的不同方法之后,我找到了另一个对我有用的解决方案。我最终使用了 IPython 的 embed() 函数。对于调试过程,我会添加

...
from IPython import embed
embed()
...

在脚本中我想停下来环顾四周的地方。一旦进入 IPython 外壳,我就可以研究可变维度并尝试操作事物。当我找到我想要的组合时,我会复制命令,退出交互式解释器并修改脚本。这对我有用的原因是它不涉及仅仅为了获取调试信息而修改程序的结构。

于 2014-01-06T20:45:00.217 回答
1

这里的问题是data并且pdata不在脚本的命名空间中;它们位于已经运行并完成的函数的本地命名空间中。

如果您希望能够在事后检查它们,则需要将它们存储在某个地方。例如:

    # ...
    plt.show()

    return data, pdata, plt

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='''some program...''')
    parser.add_argument('inputfile', help='path to input file')
    args = parser.parse_args()
    data, pdata, plt = main(args)

(或者,您可以只制作 main 的所有变量global,但这种方式看起来更干净。)

现在,您的脚本的命名空间包含名为data,的变量pdata,并且plt这些变量具有您想要的值。另外,您可以main再次调用并将其传递给不同的文件并从该文件中取回值。

于 2013-10-07T22:35:48.577 回答