LoginSignup
4
2

More than 3 years have passed since last update.

Jupyter Notebook上でシェルコマンドに(擬似的に)標準入力を与える

Posted at

小ネタです、需要があるのか知りませんが...

短く

In[1]: std_in = input()
In[2]: !echo $std_in | your_command

image.png

問題

コマンドラインで実行するコマンドのいくつかは標準入力を受け付けます。上に示した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。
image.png

所感

In [1]:!echo "これはペンです" | jumanpp

で事足りる。が、標準入力を与えたいこともある...かもしれない。

参考文献

Jupyter Notebookでシステムコマンドを実行し文字列のリストとして取得


  1. Mecabとかもそうです。 

  2. なんと呼ぶのが正確なのかわかりません。コマンドラインで実行するいわゆる"コマンド"です。 

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2