小ネタです、需要があるのか知りませんが...
短く
In[1]: std_in = input()
In[2]: !echo $std_in | your_command
問題
コマンドラインで実行するコマンドのいくつかは標準入力を受け付けます。上に示したcat
もそうですが、現実的な例としては例えば、JUMAN++という形態素解析ソフト1は標準入力に日本語の文を渡すと、形態素解析結果を返します。
$ jumanpp
これはペンです
これ これ これ 指示詞 7 名詞形態指示詞 1 * 0 * 0 NIL
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
ペン ぺん ペン 名詞 6 普通名詞 1 * 0 * 0 "代表表記:ペン/ぺん カテゴリ:人工物-その他"
です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 27 NIL
EOS
「これはペンです」が標準入力、それ以降の行は出力です。
これをJupyter Notebook上で動かしたいという問題です。
前提など
IPython/Jupyter Notebookでは行頭に!
をつけるとシステムコマンド2(シェルコマンド)が実行されます。(なおls
など基本的なコマンドのいくつかは!
をつけなくても実行されます)
In [1]:!ls
Applications/
Desktop/
Documents/
...
標準出力は、pythonの変数に代入することもできます。
In [1]:filesandfolders = !ls
In [2]:filesandfolders
['Applications',
'Desktop',
'Documents',
...]
逆に、pythonの変数をコマンドの引数にすることもできます。変数名の先頭に$
を付けるとコマンド列中で使えます。
In [1]:text = 'Hello!'
In [2]:!echo $text
Hello!
しかし、Notebookでは前述の例のように標準入力を受け取ることはできません。(jupyter==1.0.0, notebook==5.7.8)(ipythonのインタプリタではできました)
解決
pythonの関数であるinput()
は標準入力を受け付けます。Jupyter Notebook上でもいい感じの入力窓を出してくれます。(「短く」参照)
そうやって受け取った標準入力をecho
でコマンドに渡してやればOK。
所感
In [1]:!echo "これはペンです" | jumanpp
で事足りる。が、標準入力を与えたいこともある...かもしれない。
参考文献
Jupyter Notebookでシステムコマンドを実行し文字列のリストとして取得