【问题标题】:execute Bash command from IPython从 IPython 执行 Bash 命令
【发布时间】:2013-04-10 13:24:05
【问题描述】:

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

In[2]: !<my_fancy_bash_function> <function_argument>

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

In[3]: !declare -F
sh: 1: declare: not found

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

【问题讨论】:

    标签: bash ipython


    【解决方案1】:

    IPython 的创建者 Fernando Perez,suggests this

    In [1]: %%bash
    . ~/.bashrc
    <my_fancy_bash_function> <function_argument>
    

    这适用于当前的稳定版本 (0.13.2)。他承认这有点笨拙,并欢迎pull requests。 . .

    【讨论】:

      【解决方案2】:

      如果! 实现在底层使用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'
      

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

      【讨论】:

      • 很好的回复,谢谢。在您看来,什么是在来自! 实现(链接到您的答案)的衍生过程中设置环境的好方法?对 /bin/bash 到 /bin/sh 的符号链接进行快速“贫民窟”测试并发出 ! source ~/.bashrc &amp;&amp; declare -F 不会产生任何结果,而 ! env &amp;&amp; declare -F 正确打印出我声明的变量,但仍然无法访问 bash 函数......任何想法那里发生了什么?
      • 在最新版本中,您可以使用 %%bash 单元魔法来执行多行 bash。
      • 发现了一些非常神奇的东西...您可以使用简单的bash 变量扩展技巧来扩展在python 中声明的变量!例如extension=".txt" 后跟!ls *"$extension" 打印所有.txt 文件!
      猜你喜欢
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多