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

时间:2016-05-16 12:20:56

标签: ipython ipython-notebook jupyter-notebook ipython-magic

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

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

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

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

我看过IPython as a system shell,它展示了如何启用一些句法细节。在执行以下操作后,我可以在不预先!!!

的情况下运行系统命令
# Turn everything in $PATH into an alias; 
# then enable calling aliases without ! or %
%rehashx      
%autocall 2 

但是这并没有帮助为内联提供这些命令的输入:这里的文档语法在IPython中是无效的,并导致python SyntaxError。那我该怎么做呢?

2 个答案:

答案 0 :(得分:4)

bash cell magic允许你输入多行bash。只需使用%%bash启动任何单元格:

%%bash
echo "This is bash"
ls

如果您正在使用heredoc将文本传输到另一个程序,您还可以使用脚本单元格魔术:

%%script bc
2+3

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

答案 1 :(得分:4)

通过更多的研究,并在@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扩展名,我可以使用它: / p>

%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数据帧(智能列表)提供,我可以从_获取。