- はじめに -
この記事は Xonsh Advent Calendar 2017 1日目 の記事です。
タイトルが煽りです。
なんとなく贈るという単語が12月っぽいです。
内容は、Pythonで動くShellである「xonsh」の勧めを書く記事です。
追記2018/06/25:
xonshの設定に関する記事を書きました。
本記事よりも利用した上でのxonshの概要やメリット、デメリット、設定方法まで詳しく以下記事に書いてます。
vaaaaaanquish.hatenablog.com
xonsh 0.7.0が出ていますが、現在prompt-toolkit2.0の各機能対応中という感じです。
これは、ptk1.x -> 2.xにおいて結構な破壊的変更があるためです。現状はpip install xonshする時に
pip install xonsh==0.6.10
pip install prompt_toolkit==1.0.15
としておくと良いと思います。
- xonshとは -
xonshは、Pythonで作られたクロスプラットフォームのUnixライクなシェル言語とコマンドプロンプトです。
sh + Pythonのインタプリタのような取扱が可能です。
つまり以下のような事ができます。
もはやシェルスクリプトを触っているのかPythonを書いているのか分からなくなってきます。
後述しますが、もちろんShell scriptとPython scriptをサブプロセスで動作させ、それぞれの結果を参照する事も可能です。
XonshはPyCon2016でも発表されており、YouTubeに動画が上がっています。
youtu.be
その時のスライドが以下
http://lucasicf.github.io/talks/shell_python/#/
良い機能をいくつか挙げると、xonshrcがPythonで書ける、ptkとprompt-toolkitに対応しており拡張も書ける、pygmentsによるシンタクッスハイライト、proctitle対応などがあります。
bash、zshユーザ各位に殴られそうな、公式の比較の表があるので貼っておきます。
基本的に疑問があったら、Githubのissueで作者がカジュアルに色々答えてくれてたりします。
StackOverflowよりissueみたいな状態です。
もちろん私のTwitterでも答えれる限りで答えます。
ちなみに下記ツイートみたく「まだ日本語の情報が全然ないのでアドベントカレンダーを書いてほしい」とTwitterで散々言っていましたが、アレはほぼウソで、英語の情報も全然ないのでみんなGithub issueに集まるというのが今です。使ってみた記事を書くなら今です!
いやほんとXonshの日本語情報全くないのでPython書いてる各位今記事書けばGoogle検索Top間違いなしですよ本当
— ばんくし (@vaaaaanquish) 2017年11月16日
ドキュメント : 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などがbash、zsh向けに作られているために上手く動作しないので、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
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 class
!()でClassが返ってくるよ!
x = !(ls .) print(type(x)) # <class 'xonsh.proc.CommandPipeline'>
スクリプトとして走らせる
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で出揃うから要チェックだよ!
- おわりに -
テンションに疲れましたがこんな感じです。
Xonshはまだまだ情報がネットになく、日本語の記事は多分この記事が最初という感じですが、Pythonを日常的に使っていればかなり便利に取り扱う事ができるシェルだと思います。
Futureでは、urwid base化やPython2系対応、各Mac OS検証が提言されており、コミッターも募集しています。Pythonユーザの増加から考えても、今後も拡張が続きそうです。
python toolkitを使ってみた記事やxonshrcのイケてる書き方から、RNNでコマンド予測してみたみたいなハードな記事まで、アドベントカレンダーは未だ人を募集しています
さあ今すぐpip install
追記1:
アドベントカレンダー1日早く投稿してしまいました…
追記2:
xonshの読み方について
聞き間違いっぽい↓
ちなXonsh作者がPodcastで「ゾンシュ」って言ってるよ!
— ばんくし (@vaaaaanquish) 2017年11月18日
今一番有力
コンシュが正解として俺もコンシュと読んでる
xonshの読み方は"It is pronounced <i>コンシュ</i>"って公式に書いてあるのすこし嬉しかったhttps://t.co/f9xgLPvCJ5
— ハシ (@hashimock) 2017年11月30日
一応公式ページでランダムに表示される文言の中に [コンシュ] が入っている。

その他、カンク/コンクという強めの説もある。
GitHub - xonsh/xonsh: Python-powered, cross-platform, Unix-gazing shell
`pronounced conch`
xonshをどう読むべきか、google翻訳で音声読み上げてみたらゾネッシュって言ってる
— いかがわしい (@_dubiousness) 2018年5月22日
えっくすおんえすえっち
— beepcap@エビからくり民(成年済) (@beepcap) 2018年5月22日
なんですが・・・
zshもぜっとえすえっちじゃないですか。
— beepcap@エビからくり民(成年済) (@beepcap) 2018年5月22日
正直わからんのでコンシュで…