Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Jupyter NotebookでWindowsのコマンドプロンプトの命令を実行する

More than 3 years have passed since last update.

はじめに

最近 Jupyter Notebook にハマっています.
仕事での計算も,しばらく前までは Fortran 90 がメインでしたが,最近は Python3 に一本化しつつあり.Jupyter Notebook で関連プログラム類をまとめて実行・管理しています.
通常,これらの計算は,Macbook Pro 13inch Retina で行っていますが,どうしても会社支給の Windows PC でやらなければならない場合も生じてきており,Windows PC に Anaconda を入れまてみました.Python3 はもちろん,matplotlib, numpy, scipy も入っており,インストールも簡単でした.
ただし,Jupyter Notebook が入っている Anaconda Navigator を立ち上げるのに1分以上かかり,その待ち時間が結構ストレスです.まあ,一分一秒を争うわけではないので,そこは横においてある Mac をいじりながら時間つぶししています.

やりたいこと

雑談はこれくらいにして.....
計算結果を matplotlib で図化し画像出力するまではいいのですが,報告書を MS-Word で作ることが義務付けられており,これにたくさんの画像を一枚一枚貼り付けるのは大変面倒な作業です.そこで,関連する画像を結合して Word に画像を貼り付ける作業を減らすことを考えるわけです.
画像の結合は Python でプログラムを作る手もありますが,私自身画像の取扱は全くの素人でよくわかりません.ここで登場するのが,ImageMagick.
Mac なら,Jypyter Notebook の Code セルに bash のスクリプトを書き,ImageMagick のコマンドを実行できますが,Windows ではどうしたものか?

そこで思いついたのが,一手間かかりますが,Python の subprocess を使ったプログラムを作り実行すること.

以下に具体例を示します.

Jupyter Notebook で実行する Shell スクリプト(Macの場合)

ImageMagick コマンドの意味するところは以下の通り.

  • 画像 fig_chart1.png の余白を調整して画像 _1.png に出力
  • 同様に画像 fig_chart2.png の余白を調整して画像 _2.pngに出力
  • 画像 _1.png と _2.png を横に繋いで fig_flow.png を作成
%%bash
convert -trim fig_chart1.png -bordercolor 'white' -border 50x50 _1.png
convert -trim fig_chart2.png -bordercolor 'white' -border 50x50 _2.png
montage -tile 2x1 -resize 100% -geometry +0+0 _1.png _2.png fig_flow.png

Jupyter Notebook で実行する Python プログラム

Python プログラムでは,ImageMagick コマンドを文字列 cmd1, cmd2, cmd3 に格納して,subprocess.call(cmd,shell=True)で実行します.

import subprocess

cmd1='convert -trim fig_chart1.png -bordercolor "white" -border 50x50 _1.png'
cmd2='convert -trim fig_chart2.png -bordercolor "white" -border 50x50 _2.png'
cmd3='montage -tile 2x1 -resize 100% -geometry +0+0 _1.png _2.png fig_flow.png'
subprocess.call(cmd1,shell=True)
subprocess.call(cmd2,shell=True)
subprocess.call(cmd3,shell=True)
print('end')

上記により,Mac & Windows で ImageMagick を用いた同じ処理が可能となります.
もちろん ImageMagick は各マシンに別途インストールしなければなりません.

以 上

damyarou
設計コンサルタント会社勤務.土木技術者
https://damyarou.hatenablog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away