如何将ZSH与(i)python集成?
我一直很喜欢 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。
就像我说的,这个方法对我有效,虽然我不太确定背后发生了什么问题。