Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

Pythonistaに贈るXonshのススメ

- はじめに -

この記事は Xonsh Advent Calendar 2017 1日目 の記事です。

タイトルが煽りです。

なんとなく贈るという単語が12月っぽいです。

内容は、Pythonで動くShellである「xonsh」の勧めを書く記事です。


 

- xonshとは -

xonshは、Pythonで作られたクロスプラットフォームUnixライクなシェル言語とコマンドプロンプトです。

sh + Pythonインタプリタのような取扱が可能です。
つまり以下のような事ができます。

f:id:vaaaaaanquish:20171118064346p:plain:w400:h350

もはやシェルスクリプトを触っているのかPythonを書いているのか分からなくなってきます。

後述しますが、もちろんShell scriptとPython scriptをサブプロセスで動作させ、それぞれの結果を参照する事も可能です。


XonshはPyCon2016でも発表されており、YouTubeに動画が上がっています。
youtu.be
その時のスライドが以下
http://lucasicf.github.io/talks/shell_python/#/


良い機能をいくつか挙げると、xonshrcがPythonで書ける、ptkとprompt-toolkitに対応しており拡張も書ける、pygmentsによるシンタクッスハイライト、proctitle対応などがあります。

bashzshユーザ各位に殴られそうな、公式の比較の表があるので貼っておきます。

f:id:vaaaaaanquish:20171118065738p:plain
http://xon.sh/index.html#comparison


基本的に疑問があったら、Githubのissueで作者がカジュアルに色々答えてくれてたりします。
StackOverflowよりissueみたいな状態です。
もちろん私のTwitterでも答えれる限りで答えます。


 
ちなみに下記ツイートみたく「まだ日本語の情報が全然ないのでアドベントカレンダーを書いてほしい」とTwitterで散々言っていましたが、アレはほぼウソで、英語の情報も全然ないのでみんなGithub issueに集まるというのが今です。使ってみた記事を書くなら今です!


ドキュメント : http://xon.sh/index.html
Github : https://github.com/xonsh/xonsh
作者がxonshについて語るpodcast : https://www.podcastinit.com/episode-29-anthony-scopatz-on-xonsh/


 

- 導入 -

http://xon.sh/#contents 内のInstallationに書いてある。
Mac, Windows, Linuxそれぞれの代表的なパッケージ管理やpip、condaを使ってのインストールが可能。

pyenv上のpipでインストールすると `/Users/hoge/.pyenv/shims/xonsh` にXonshが入る。
今時居ないかもしれないが、仕事の都合で2系と3系を行き来するという場合は不便な場合がある。

そもそもvenvやvirtualenv、pewなどがbashzsh向けに作られているために上手く動作しないので、Xonshでは Vox なる独自のenvツールが用意されている。
http://xon.sh/python_virtual_environments.html
virtualenvっぽい形式で操作が可能なので、純粋に標準Pythonで入れてVoxで十分な環境構築が可能である。

 
試しにPython3.xに付随するpipで導入してみる。
readline shellとして使いたい時はgnureadlineも必要。引数周りが激的によくなる。

pip install xonsh
pip install gnureadline

Macの場合のみ以下bashの補完パッケージを入れておく。

brew install bash-completion2

xonshコマンドで実行するか、`which xonsh` した先のxonshを標準コマンドプロンプトとして登録すれば終わり。

$ xonsh


 

- 使ってみよう -

導入は済んだね!

イエーイ!!
よくできました!!

それじゃあさっそくテンション上げて使ってみましょう!!
 

Pythonとshell scriptどちらも走る

変数を使ったりコマンドを使う事もできるよ!簡単だね!

 $ ls -l
total 0
 $ ls = 100
 $ l = 20
 $ ls -l
80
 $ del ls
 $ ls -l
total 0

面白いね!

 

サブプロセスとして走らせる

shell scriptとpython stringの相互変換もできるよ!
その結果をpipeしたりredirect、I/O redirect、background jobにすることも容易だよ!

もちろん下に書くサブプロセス演算子は複合して色々書けるけど悪用しないでね!公式もそう言ってるよ!絶対ダメだよ!
http://xon.sh/tutorial.html#nesting-subprocesses
 

shell script -> python string

$()でPython Stringが返ってくるよ!

x = $(ls -l)
print(x)    # lsの結果
shell script -> python class

!()でClassが返ってくるよ!

x = !(ls .)
print(type(x))    # <class 'xonsh.proc.CommandPipeline'>
python -> shell script

@でPythonスクリプトの結果が文字列が返ってくるよ!

import sys
echo @(sys.version_info.major)   # 3
python -> stdio

実行結果を直接出力してNone返す事もできるよ!

x = ![ls -l]    # この行が走った時点で標準出力される
x is None    # True

 

スクリプトとして走らせる

xonshコマンドで-cオプションをつければスクリプトが走るよ!

xonsh -c "echo @(7+3)"

test.xshでスクリプトファイルを書くこともできるよ!

#!/usr/bin/env xonsh
# test.xsh
echo @(7+3)

上のファイルを走らせるよ!

xonsh test.xsh

別fileからのスクリプトのインポートもPythonらしさあるよ!

from test import *

以下が参考になるよ!
http://xon.sh/tutorial.html#executing-commands-and-scripts
http://xon.sh/tutorial.html#importing-xonsh-xsh

 

xonshrc

Pythonでxonshrcが書けるよ!

Pythonで関数を定義してその関数にaliasを貼ったりできるからPythonさえ書ければshell script忘れてもまあ書けるし、「よく分からんけどネットで見つけたshコピペしてbashrcに貼ってる」みたいなPythonエンジニアにはオススメだよ!もちろんそんなエンジニアは居ないと思うけどね!!

/etc/xonshrcを書こうね!

# xonshrc
def _hello(args, stdin=None):
    return ('Hello, World!', None)
aliases['hello'] = _hello

実行してみよう!

 $ source /etc/xonshrc
 $ hello    # Hello, World!

http://xon.sh/tutorial.html#customizing-the-prompt

xonshrcのイケてるセッティングはきっとXonsh Advent Calendar 2017で出揃うから要チェックだよ!


 

- bashからの移行 -

Bash to Xonsh Translation Guide — xonsh 0.6.4 documentation

ガイドがあるよ!簡単だね!

 
 

- おわりに -

テンションに疲れましたがこんな感じです。

Xonshはまだまだ情報がネットになく、日本語の記事は多分この記事が最初という感じですが、Pythonを日常的に使っていればかなり便利に取り扱う事ができるシェルだと思います。

Futureでは、urwid base化やPython2系対応、各Mac OS検証が提言されており、コミッターも募集しています。Pythonユーザの増加から考えても、今後も拡張が続きそうです。


python toolkitを使ってみた記事やxonshrcのイケてる書き方から、RNNでコマンド予測してみたみたいなハードな記事まで、アドベントカレンダーは未だ人を募集しています

さあ今すぐpip install

qiita.com

 
追記1:

アドベントカレンダー1日早く投稿してしまいました…
 
追記2:

xonshの読み方について

聞き間違いっぽい↓

今一番有力
コンシュが正解として俺もコンシュと読んでる


一応公式ページでランダムに表示される文言の中に [コンシュ] が入っている。
f:id:vaaaaaanquish:20180520181037p:plain

その他、カンク/コンクという強めの説もある。
GitHub - xonsh/xonsh: Python-powered, cross-platform, Unix-gazing shell
`pronounced conch`



正直わからんのでコンシュで…