non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

シェルスクリプトのかわりにPythonでマルチプラットフォームで動かそうとして学んだこと

おはようございます。長男は最近どんどん手がかからずお兄さんになってきてくれてますが、爪を噛む癖が治りません。長男の爪を切った記憶がないです。この癖が心配な@kjunichiです。

背景

シェルスクリプトだとWindows環境で動かせないからPythonベースでgit cloneして 特定のハッシュのコミットを取出し、ファイルにあらかじめ用意してあるパッチを当てるという 一連の処理をやってみた。

以下の内容は、Python3をターゲットにしている。

Python3以降での外部コマンドの実行

まぁ、たいていのスクリプト言語では外部コマンドの実行をサポートしているはずと、調べて、 Python3系では

import subprocess

subprocess.call(["git","clone","https://github.com/tensorflow/models.git"])

といった感じで出来ることが分かりました。過去にはosモジュールを使った方法だったようですが、このsubprocessモジュールを使うのはこちらの

qiita.com

のコメント欄で知りました。

躓いたところ

cpコマンドがWindowsにはない

Windows上ではgit cloneして、VS Codeでファイルを編集することが大半で、 たまに家族の写真をコピーしたりといった操作は、エクスプローラーで行っていた為、 cpコマンドが無いことをすっかり忘れていた。

対応内容

PythonAPIでファイルのコピーを行った。

shutilモジュールのcopyfileを使うと実現できる。

import shutil

src_path =  os.path.abspath("models/tutorials/image/imagenet/classify_image.py")
dest_path = os.path.abspath("./classify_image_web.py")

shutil.copyfile(src_path, dest_path)

Pythonでの実装のため、os.path.abspathにより、Windowsのパスも/で記述でき、 おかげで、Windows用のパスの表記を別に記述することなく、スマートに実現できました。

WindowsのpatchコマンドはCR+LFを期待している

WindowsでPatchコマンドがエラーになる

前提として、chocolateyでpatchコマンドをインストールしている。

これはPythonには関係ないが、非Windows系のプラットフォームで作製して、 動作確認して、Windowsにいざ持ってきてハマりそうなところだと思うので 挙げた。

Windows版のpatchコマンドは改行コードをCR+LFを要求している。 しかし、非Windowsな環境で作製したpatchファイルは当然のLFのみの 改行となっている。

この為、非Windows環境で作ったpatchファイルをそのままWindows環境に持ってくると エラーとなり、patchが適用できない。

バイナリーオプションをpatchコマンドに適用することでこれを回避できた。

subprocess.call(["patch", "--binary","-u", "classify_image_web.py", "patch"])

関連記事