我想把一个带有一些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
。那我该怎么做呢?
答案 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数据帧(智能列表)提供,我可以从_
获取。