从IPython执行Bash命令

chr*_*ris 18 bash ipython

我想在使用!运算符从IPython执行bash命令时获取bash环境,从而允许我访问我定义的bash函数:

In[2]: !<my_fancy_bash_function> <function_argument>
Run Code Online (Sandbox Code Playgroud)

目前IPython正在采购sh而不是bash:

In[3]: !declare -F
sh: 1: declare: not found
Run Code Online (Sandbox Code Playgroud)

如何bash从IPython中获取和设置我的环境设置?

Jas*_*ram 19

IPython的创建者Fernando Perez 建议:

In [1]: %%bash
. ~/.bashrc
<my_fancy_bash_function> <function_argument>
Run Code Online (Sandbox Code Playgroud)

这适用于当前的稳定版本(0.13.2).他承认这有点笨重,并欢迎拉请求...


D.S*_*ley 13

如果!实现使用IPython.utils._process_posix.system引擎,那么它将使用任何which sh返回作为处理shell.这可能是Bourne shell的真正实现 - 在许多Linux上,它可能是Bash的兼容模式.在我的MacBook Pro上看起来它是一个原始的Bash shell:

In [12]: !declare -F

In [13]: !echo $BASH
/bin/sh

In [14]: !echo $BASH_VERSION
3.2.48(1)-release

In [15]: import os

In [16]: os.environ['SHELL']
Out[16]: '/bin/zsh'
Run Code Online (Sandbox Code Playgroud)

我希望它会使用$SHELL环境变量,但今天似乎没有.您可以分支github repo,修改ProcessHandler.sh属性实现以查看os.environ['SHELL']并使用它如果设置而不是调用pexpect.which('sh').然后发出拉取请求.

  • 在最近的版本中,您可以使用%% bash cell magic来执行多行bash. (3认同)
  • 发现了一些非常惊人的东西……你可以使用简单的 `bash` 变量扩展技巧来扩展在 `python` 中声明的变量!例如`extension=".txt"` 后跟`!ls *"$extension"` 打印所有`.txt` 文件! (2认同)