交互模式和脚本模式之间如何交换数据?

4
假设要在脚本模式下运行一段代码并生成如下数据:
my_data = [1, 2, 3, 4] #please note this is output after running not data in script

现在我切换到控制台来调试代码。我需要使用刚刚产生的数据,但是不能直接复制以避免乱码的影响。我的解决方案是先在脚本模式下进行pickle,然后在交互模式下进行unpickle:

包含5个命令的代码:

脚本模式

import pickle

with open('my_data','wb') as file:
        pickle.dump(my_data, file)

交互模式:

import os, pickle
# change to the working directory
os.chdir('~\..\')
with open('my_data', 'rb') as file:
         my_data = pickle.load(file)
# my_data is finally loaded in console
# then manipulate it on the console.

如何通过更少的步骤来完成?

你所说的“交互式(interactive)”是指IDLE吗?变量是可用的——我刚刚检查过了。 - aaron
这是一个作用域变量吗?请展示相关代码。 - aaron
是的,问题是要检查pickle是否是处理文件最快的方法。@aaron - AbstProcDo
是的,但在你的情况下可能不必要。 - aaron
2
不确定我是否理解您的问题,但如果您使用ipython而不是标准的python IDLE,您可以通过运行%run -i script.py轻松运行脚本并保留在脚本中定义的对象(变量、函数、类等)。然后就没有必要pickle / unpickle东西了。顺便说一句,我说的不是jupyter(以前称为“ipython笔记本”),而只是作为交互式shell的ipython。 - jorgeh
显示剩余2条评论
3个回答

2
您可以使用-i选项运行文件,例如python -i your_file_name.py
这将首先运行您的文件,然后打开一个交互式 shell,并准备好使用所有变量。

$ python3 -i divide_to_chapters.py 并调用 >>> content_list 时出现 NameError: name 'content_list' 未定义。 - AbstProcDo
@DFK 如果我不知道 divide_to_chapters.py 是什么,那么我就无法做太多事情。 - Uriel

2
如果在您的/path/to/your/project目录中,您有以下形式的脚本your_script.py
my_data = [1, 2, 3, 4]

如果您想在Python 2交互式shell中调试脚本,可以执行以下操作:
$ python
>>> execfile('/path/to/your/project/your_script.py')

或者,使用Python 2+3的方式:

>>> exec(open('/path/to/your/project/your_script.py').read(), globals())

内置函数exec()支持动态执行Python代码。 内置函数globals()返回当前全局字典。 这样您就可以访问您的数据:
>>> my_data
[1, 2, 3, 4]

数据不在脚本中,而是由实现产生的。 - AbstProcDo

1
个人而言,我会使用IPython,只需:

pip install IPython

然后,无论何处您想要进入控制台,只需

import IPython

在文件顶部使用以下内容:

,并保留HTML标签,不解释。

IPython.embed()

你可以选择想要进入的位置。

在进入后,你可以输入"whos"来获取变量列表及其类型和值。这非常有用,但是没错,IPython是一个稳定的Python shell。

如果你更习惯标准pdb,也可以使用ipdb。它也非常好用。


{btsdaf} - AbstProcDo
{btsdaf} - Saedeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接