5

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

bash-3.2$ mysql -u root <<END_IPUT
> use mydb;
> show tables;
> END_INPUT

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

In [7]:  !! ls -tF
Out[7]:  ['Demo-notebook.ipynb',
          'createdb.sql',
          ...

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

# Turn everything in $PATH into an alias; 
# then enable calling aliases without ! or %
%rehashx      
%autocall 2 

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

4

2 回答 2

7

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

%%bash
echo "This is bash"
ls

如果您使用 heredoc 将文本通过管道传输到另一个程序,您还可以使用脚本单元魔术:

%%script bc
2+3

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

于 2016-05-18T08:37:47.030 回答
5

通过更多的研究,并在@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']
    
  • %%bash按照建议将其更改为@ThomasK,并打印输出,而不是返回。要捕获它以进行进一步处理,ipython请提供--out参数。但是我需要自己打印它——默认情况下它不会显示出来。

    In[1]:  %%bash --out var
            echo Hello, world
            echo "   Again"
    
    In[2]:  var
    
    Out[2]: 'Hello, world\n   Again\n'
    
  • %%bash实际上是 的简写%%script bash,被称为“像#!脚本中的行一样”工作(参见 的帮助%%script?)。它确实如此。因此,这里是如何放弃 here-document 语法并让任何程序读取单元格内容作为输入的方法。%%script也接受--out参数。

            %%script --out var mysql -u root -p XYZ
            USE somedb;
            SELECT * FROM users
                 WHERE passwd IS NULL\G
    

这很好,但我最终没有使用它,因为我的用例是mysql,最终我发现有一个很棒的第三方ipython-sql扩展可以用来代替:

%load_ext sql
%sql mysql+pymysql://user:passwd@localhost/somedb

这以安装扩展为前提,带有pip install ipython-sql. 对于mysql,我也需要pip install pymysql。完成上述设置后,我只是像这样与数据库交谈

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

Out[1]: 1 rows affected.
        ...

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

于 2016-05-18T14:55:06.440 回答