如何将ZSH与(i)python集成?

11 投票
2 回答
10362 浏览
提问于 2025-04-15 12:08

我一直很喜欢 zsh,最近我发现 ipython 这个交互式解释器比 python 本身有很多优点。能够使用 cd(切换目录)、ls(列出文件)、run(运行)或者 !(执行命令)确实很方便。不过,现在在使用 ipython 的时候,感觉 zsh 有点笨重,我在想怎么能更好地把 zsh 和 ipython 结合起来。

当然,我可以重写我的 .zshrc 文件和所有的脚本,用 python 来模拟我在 shell 里的大部分操作,但这样做感觉不太对。而且我显然也不准备把 ipython 当作主要的命令行工具。

所以,我的问题是:你们是怎么在 shell 和 python 命令循环之间高效工作的?我是不是漏掉了什么明显的整合方法?我需要在 emacs 里做这些吗?

2 个回答

7

你可以通过在命令前加一个感叹号来运行一些系统命令,并把结果存储到一个python变量里。比如:列出你电脑上/tmp文件夹里的目录:

ipy> import os
ipy> tmplist = !find /tmp
ipy> [dir for dir in tmplist if os.path.isdir(dir)]

这个列表对象是一个特别的ipython对象,里面有很多有用的方法。比如:列出所有以.pdf结尾的文件。

ipy> tmplist.grep(lambda a: a.endswith('.pdf')) # using a lambda
ipy> tmplist.grep('\.pdf$') # using a regexp

通过查看魔法命令的列表,你可以做很多事情:

ipy> %magic

可以查看Ipython文档中的shell部分

12

我在zsh的讨论组里问了这个问题,得到了一个对我有效的答案。你的情况可能会有所不同。

在genutils.py文件中,在以下这一行之后:

if not debug:

删除这一行:

stat = os.system(cmd)

把它换成:

stat = subprocess.call(cmd, shell=True, executable='/bin/zsh')

你看,问题在于那个“!”调用使用了os.system来执行命令,而这个默认是用老旧的/bin/sh。

就像我说的,这个方法对我有效,虽然我不太确定背后发生了什么问题。

撰写回答