2016-05-16 127 views
2

我想用一些shell命令和它们的输入组合一个IPython笔记本。在bash提示符我可以使用“这里的文档”语法:如何向IPython(notebook)shell命令提供内联输入?

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

我如何在IPython中相同的效果,特别在jupyter笔记本吗?我知道如何为IPython的是“行法术”或“细胞 魔法”,例如:

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

我已经看了IPython as a system shell,它展示了如何使一些细微的语法执行shell命令。下面,我可以不预先考虑!!!

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

运行系统命令,但没有这种帮助与提供输入这些命令行内:在这里文档语法是IPython的无效,导致蟒蛇SyntaxError 。那我该怎么做呢?

+0

你是否尝试过bash细胞魔法?用行'%% bash'开始一个单元格,并在其余部分放入bash代码。 –

+1

好的建议,谢谢!我已经找到了'%% sx',它和我想的一样。但'%bash'的文档使我找到了'%% script',这正是我想要的。与此同时,我还发现了一个专门用于'sql'的扩展,它更好地解决了我的即时问题。但如果你想写一个扩展你的建议的答案,我会接受它。 – alexis

+0

@Thomas,在你第三次删除我的标签之前,看看有多少人关注每一个。如果[tag:ipython-notebook]出现这样的问题,请执行该过程以合并标签。 – alexis

回答

3

bash cell magic允许你输入多行bash。刚开始的任意单元格与%%bash

%%bash 
echo "This is bash" 
ls 

如果您使用的是定界符管道文本到另一个程序,您还可以使用脚本细胞法宝:

%%script bc 
2+3 

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

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?帮助)。它做什么。所以下面是如何免除这里文档的语法,并让任何程序读取单元格内容作为输入。 %%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:[email protected]/somedb 

这假设安装扩展名为pip install ipython-sql。对于mysql,我还需要pip install pymysql。上面的设置后,我只是跟数据库这样

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

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

返回表实际上是绘制与边框的笔记本电脑桌,这是还挺不错。它可以作为一个熊猫数据框(一个智能列表),我可以从_获取。

+0

我可以这样做:'%% bash/usr/bin/env ipython'为了在命令行运行一个导出的'notebook.py'? – jtlz2