我有一个名为“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 who
和whos
命令会显示{{ 1}}。同样,如果我首先进入ipython shell然后执行:
Interactive namespace is empty
当脚本完成时(再次,大量输出,图表显示)我得到相同的结果:一个空的交互式命名空间。
在理解如何运行外部并使用ipython以交互方式浏览脚本中的数据/对象方面我缺少什么?
以下是我的脚本(In [2]: run poc.py inputfile.txt
)如何设置的准系统示例:
poc.py
答案 0 :(得分:8)
在这里回答自己。我知道这可能是一个评论,但我认为这个描述需要一个独立的答案。
基本上花了一些时间来理解每个人提到的关于我的变量超出范围的问题,以及处理它的不同方法,我找到了另一个对我有用的解决方案。我最终使用了IPython中的embed()函数。对于调试过程,我会添加
...
from IPython import embed
embed()
...
在剧本中我想停下来环顾四周的地方。一旦放入IPython shell,我就可以调查变量维度并尝试操作事物。当我找到我想要的组合时,我会复制命令,退出交互式解释器并修改脚本。这对我有用的原因是它不涉及修改程序的结构只是为了得到调试信息。
答案 1 :(得分:1)
这里的问题是data
和pdata
不在您脚本的命名空间中;它们位于已经运行并完成的函数的 local 命名空间中。
如果您希望能够在事后检查它们,则需要将它们存储在某处。例如:
# ...
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)
(或者,您可以只创建所有主变量global
,但这种方式似乎更清晰。)
现在,您的脚本命名空间包含具有您想要的值的名为data
,pdata
和plt
的变量。另外,您可以再次调用main
并将其传递给另一个文件并从该文件中获取值。