dockerで機械学習(103) 環境構築(3)docker/linux/macos bash スクリプト, ms-dos batchファイル


docker

dockerでシェルスクリプトを作るには、何かエディタがあるとよい。

エディタ

# apt-get install vim

編集

# vi py.sh

拡張子はsh(shell script)

実行権

# chmod +x py.sh

+x で実行権(eXecute)を付与する。

実行

./py.sh ch01

./をつけて、現在のディレクトリのファイルであることを指定。

例題

py.sh
#!/bin/bash
cd $1
for f in *.py 
  do 
    python $f.py
  done
cd ..

というファイルを作成

# ./py.sh ch01
(null): can't open file 'analyze_webstats.py.py': [Errno 2] No such file or directory
(null): can't open file 'gen_webstats.py.py': [Errno 2] No such file or directory
(null): can't open file 'performance_test.py.py': [Errno 2] No such file or directory

# ls ch01
analyze_webstats.py  data  gen_webstats.py  performance_test.py

おお、実行時の.pyが余分だった。

py.sh
#!/bin/bash
cd $1
for f in *.py
  do 
    python $f
  done
cd ..

実行しなおし。

(base) root@fc6d6bfbba64:/BuildingMachineLearningSystemsWithPython# ./py.sh ch01
Traceback (most recent call last):
  File "analyze_webstats.py", line 10, in <module>
    import matplotlib.pyplot as plt
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/backend_qt5agg.py", line 15, in <module>
    from .backend_qt5 import (
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/backend_qt5.py", line 19, in <module>
    import matplotlib.backends.qt_editor.figureoptions as figureoptions
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/qt_editor/figureoptions.py", line 20, in <module>
    import matplotlib.backends.qt_editor.formlayout as formlayout
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/qt_editor/formlayout.py", line 54, in <module>
    from matplotlib.backends.qt_compat import QtGui, QtWidgets, QtCore
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/qt_compat.py", line 158, in <module>
    raise ImportError("Failed to import any qt binding")
ImportError: Failed to import any qt binding
Traceback (most recent call last):
  File "gen_webstats.py", line 14, in <module>
    import matplotlib.pyplot as plt
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/backend_qt5agg.py", line 15, in <module>
    from .backend_qt5 import (
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/backend_qt5.py", line 19, in <module>
    import matplotlib.backends.qt_editor.figureoptions as figureoptions
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/qt_editor/figureoptions.py", line 20, in <module>
    import matplotlib.backends.qt_editor.formlayout as formlayout
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/qt_editor/formlayout.py", line 54, in <module>
    from matplotlib.backends.qt_compat import QtGui, QtWidgets, QtCore
  File "/opt/conda/lib/python3.7/site-packages/matplotlib/backends/qt_compat.py", line 158, in <module>
    raise ImportError("Failed to import any qt binding")
ImportError: Failed to import any qt binding
Traceback (most recent call last):
  File "performance_test.py", line 12, in <module>
    number=10000)
  File "/opt/conda/lib/python3.7/timeit.py", line 232, in timeit
    return Timer(stmt, setup, timer, globals).timeit(number)
  File "/opt/conda/lib/python3.7/timeit.py", line 176, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
NameError: name 'xrange' is not defined

し、し、しまった。python 2.7じゃないとダメだった。

参考資料(reference)

docker 入門
https://qiita.com/kaizen_nagoya/items/2f31319e40ddaa0bf8a5

shell でディレクトリ内のファイルに対してループ処理
https://qiita.com/elzup/items/e839a8c4e815808fb4bc

bashの変数展開によるファイル名や拡張子の取得
https://qiita.com/mriho/items/b30b3a33e8d2e25e94a8

パス文字列からファイル名などを抜き出す
https://qiita.com/ktr_type23/items/94747a4b27e8a630ce48

初心者向けシェルスクリプトの基本コマンドの紹介
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337

シェルスクリプトの基礎知識まとめ
https://qiita.com/katsukii/items/383b241209fe96eae6e7

プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話
https://qiita.com/piroor/items/77233173707a0baa6360

文書履歴

ver. 0.10 初稿 20181006
ver. 0.11 番号変更、参考文献追記 20181028