如何为 IPython(笔记本)shell 命令提供内联输入?

ale*_*xis 4 ipython ipython-notebook ipython-magic jupyter-notebook

我想将 IPython 笔记本与一些 shell 命令及其输入放在一起。在 bash 提示中,我可以使用“here-document”语法:

bash-3.2$ mysql -u root <<END_IPUT
> use mydb;
> show tables;
> END_INPUT
Run Code Online (Sandbox Code Playgroud)

如何在 IPython 中获得相同的效果,特别是在 jupyter 笔记本中?我知道如何将 shell 命令作为 IPython 执行为“行魔术”或“单元魔术”,例如:

In [7]:  !! ls -tF
Out[7]:  ['Demo-notebook.ipynb',
          'createdb.sql',
          ...
Run Code Online (Sandbox Code Playgroud)

我已经将IPython 视为一个系统 shell,它展示了如何启用一些语法细节。在以下之后,我可以运行系统命令而无需预先添加!!!

# Turn everything in $PATH into an alias; 
# then enable calling aliases without ! or %
%rehashx      
%autocall 2 
Run Code Online (Sandbox Code Playgroud)

但是这些都无助于为这些命令提供输入内联:here-document 语法在 IPython 中无效,并导致 python SyntaxError。那么我该怎么做呢?

ale*_*xis 6

经过更多的研究,并在 @ThomasK 的提示(参见已接受的答案)的帮助下,我找到了几种方法来做到这一点。

  • 一种解决方案是细胞魔法%sx。它将单元格内容作为 bash 脚本执行,并捕获输出并将其作为行列表返回。有时方便,有时不方便。

    In[1]:  %%sx
            echo Hello, world
            cat -n <<DATA
            this
            and that
            DATA
    
    Out[1]: ['Hello, world', '     1\tthis', '     2\tand that']
    
    Run Code Online (Sandbox Code Playgroud)
  • %%bash按照建议将其更改为@ThomasK,输出将被打印出来,而不是返回。要捕获它以进行进一步处理,ipython请提供--out参数。但随后我需要自己打印它——默认情况下它不会显示。

    In[1]:  %%bash --out var
            echo Hello, world
            echo "   Again"
    
    In[2]:  var
    
    Out[2]: 'Hello, world\n   Again\n'
    
    Run Code Online (Sandbox Code Playgroud)
  • %%bash实际上是 的简写%%script bash,被宣传为“像#!脚本中的行”一样工作(请参阅 的帮助%%script?)。确实如此。因此,以下是如何免除此处文档语法并让任何程序读取单元格内容作为输入。%%script也接受--out参数。

            %%script --out var mysql -u root -p XYZ
            USE somedb;
            SELECT * FROM users
                 WHERE passwd IS NULL\G
    
    Run Code Online (Sandbox Code Playgroud)

这已经足够好了,但我最终没有使用它,因为我的用例是mysql,最终我发现有一个很棒的第三方ipython-sql扩展可供我使用:

%load_ext sql
%sql mysql+pymysql://user:passwd@localhost/somedb
Run Code Online (Sandbox Code Playgroud)

这预先假定安装扩展,带有pip install ipython-sql. 对于mysql,我也需要pip install pymysql。完成上述设置后,我就这样与数据库对话

In[1]:  %%sql 
        SELECT * FROM users
            WHERE passwd IS NULL

Out[1]: 1 rows affected.
        ...
Run Code Online (Sandbox Code Playgroud)

返回的表格实际上被绘制为带有边框的笔记本表格,这有点不错。它以 Pandas 数据框(智能列表)的形式提供,我可以从_.


Tho*_*s K 5

bash 单元魔术允许您输入多行 bash。只需使用以下命令启动任何单元格%%bash

%%bash
echo "This is bash"
ls
Run Code Online (Sandbox Code Playgroud)

如果您使用 heredoc 将文本通过管道传输到另一个程序,您还可以使用 script cell magic:

%%script bc
2+3
Run Code Online (Sandbox Code Playgroud)

可能还有其他细胞魔法可以更具体地解决您的问题!