我们能在Python中运行IPython命令吗?

6
假设我想使用Jupiter笔记本/ipython作为开发环境,然后将所有内容复制到Python脚本中。在ipython中,我们有像下面这样的命令:
In [1]: cd ..
/Users/myname/Desktop/software

In [2]: ls
  blah_blah_blah/ 

假设我完成了我的ipython笔记本,并希望复制所有内容(假设我有1000行,无法逐一编辑)。是否可以使我的Python脚本理解诸如“cd ..”等行。


osos.path模块可以执行像cd这样的操作。 - hpaulj
2个回答

4
任何使用标准 Python 解释器运行 IPython 代码的方法都会有一些复杂性。例如,请参见 this 中的问题,其中一个答案演示了调用 IPython 的“魔法”方法来执行 shell 命令。
from IPython.terminal.embed import InteractiveShellEmbed

ipshell = InteractiveShellEmbed()
ipshell.dummy_mode = True
ipshell.magic("%timeit abs(-42)")

更简单的方法是使用IPython解释器运行您保存的脚本。您需要确保每个shell命令前面都加上% ,因为这表示“魔术”命令。这应该是一个简单的查找和替换任务,因为我怀疑您使用了太多的shell命令。如果有很多不同的shell命令需要添加%,您还可以编写一个简短的脚本来帮助您完成这项工作。您还需要确保您的脚本具有扩展名.ipy

script.ipy:

%cd ..
%ls
x = "My script!"
print(x)

从终端运行脚本:

>>> ipython script.ipy

0
如上所述,我们可以使用命令行中的ipython来运行ipython脚本:
ipython my_script.ipy

然而,魔法单元格目前效果不佳。例如,如果您有以下脚本:

%%writefile hello.txt
this is a line
another line

print ('hello')

my_path = '/path/to/folder'
list_of_txt = !ls {my_path}/*.txt
print (list_of_txt)

它将运行初始单元格魔术命令%%writefile,就好像整个文件是一个单独的单元格。为了避免这种情况,您必须使用get_ipython().run_cell_magic()

由于每个IPython命令都需要不同的函数,我发现编写您想要在笔记本中使用的IPython命令,然后在笔记本的菜单中执行文件>"保存和导出笔记本为">"可执行脚本"(在jupyter lab中,但可能可以在普通的jupyter notebook中进行类似的操作)。它将使用IPython库中的适当函数转换所有特定于IPython的代码。

例如,如果我们将先前的脚本复制并粘贴到笔记本的不同单元格中,并将其导出为.py文件,则会给我们生成以下Python代码:

导出脚本中编写的代码:

get_ipython().run_cell_magic('writefile', 'hello.txt', 'this is a line\nanother line\n')

my_path = '/path/to/folder'
list_of_txt  = get_ipython().getoutput('ls {my_path}/*.txt')
print (list_of_txt)

您可以直接使用命令行中的ipython运行导出的脚本:

ipython my_exported_script.py

或者,在ipython会话中,使用以下命令:

%run my_exported_script.py

这适用于 IPython 1.x 版本


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