
【Python】【bat】Pythonでshell / bat操作
筆者はPythonでツールを作るのが多いのですが、最近shell / bat操作をする機会があったので、そのあたりをまとめれればと思います。
PythonでShell / bat操作をするには?
ライブラリを使う必要があります。筆者が使用したことがあるものですと、
・os
・subprocess
を使いました。
今回はこの2つについてのまとめと、それを使って表題の件について、まとめていこうかと思います。
os
osは昔からありますよね。Python 2系の頃からあった気がします。Pathの取得などでよく使っていましたね。
よく使うコマンド一覧
import os
# 作業ディレクトリ、サブディレクトリ、ファイルを一覧で取得
for workDir, subdirs, files in os.walk("Workdir"):
// 処理を定義。
// 作業ディレクトリ:workDir
// サブディレクトリ:subdirs
// ファイル:files
# 現在の作業ディレクトリの取得
workDir = os.getcwd()
# 作業ディレクトリの移動
os.chdir(‘subdir/subsubdir’)
# シェルでコマンドの実行
os.system(‘XXX(command)’)
# Pathの結合
os.path.join(pathA,pathB)
ちなみにpathの取得等の操作で言うならpathlibライブラリも一つの手ですね。たしかPython 3.4から標準ライブラリです入ってたと思います。ついでにまとめちゃいましょうかね。
pathlib
import pathlib
# Pathの定義
path = pathlib.Path('c:/XXXX/YYYY/ZZZZ') // 絶対Path
path = pathlib.Path('/ZZZZ') // 相対Path
# 現在のディレクトリPathを取得
path = pathlib.Path.cwd()
# Pathの結合
path = pathlib.Path('c:/XXXX','YYYY','ZZZZ')
path = pathlib.Path('XXXX/YYYY') / pathlib.Path('ZZZ.txt')
# 絶対Pathを相対Pathへ変換
path = pathlib.Path('c:/XXXX/YYYY/ZZZZ.txt')
path = path.relative_to('c:/XXXX')
# 相対Pathを絶対Pathへ変換
path = pathlib.Path('YYYY/ZZZZ.txt')
path = path.absolute()
# Pathを変更
path.rename('c:/XXXX/YYYY/AAAA.txt')
# Pathを上書き
path.replace('c:/XXXX/YYYY/AAAA.txt')
# Pathの操作
path = pathlib.Path('c:/XXXX/YYYY/ZZZZ.txt')
path.parent // 現在の作業ディレクトリ名
path.name // 拡張子を含んだファイル名
path.stem // 拡張子を含まないファイル名
path.suffix //拡張子名
# ファイル名だけの変更
path.with_name(‘eee.txt’)
# 拡張子の変更
path.with_suffix(".csv")
# ファイルの読み込み
path.read_text()
# ファイルへ書き込み
path.write_text('HELLO WORLD')
# open()と同じようにファイルを開く
with path.open(encoding='xxx') as f:
print(f.read())
# ファイルの削除
path.unlink() # ディレクトリの場合はrmdir()
# jsonの読み込み
import json
j_data = json.loads(path.read_text())
# jsonへ書き込み
path.write_text(json.dumps(j_data))
# ディレクトリ作成
dir_path = pathlib.Path('./aaaa/bbbb')
dir_path.mkdir() # parents=Trueで親ディレクトリも作成可能
# ディレクトリ削除
dir_path = pathlib.Path('./aaaa/bbbb')
dir_path.rmdir()
# パスの有無の確認
path.exists() // 戻り値:True or False
# ファイルの有無の確認
path.is_file() // 戻り値:True or False
# ディレクトリの有無の確認
path.is_dir() // 戻り値:True or False
だいぶ脇道に逸れてしまいました。。。
話を戻しまして、最近 (と言っていいのか?) osではなく、subprocessが出てきましたよね。今はこちらの方が使う機会が多くなってきました。
subprocess
import subprocess
# シェルで実行したいコマンドを実行。
subprocess.run(‘echo HELLO WORLD!’, cwd='c:/xxx/', shell=True) //cwd:作業ディレクトリの指定。shell:標準のシェルで実行。
subprocess.run([‘./test.bat’, 'arg1', 'arg2'], cwd='c:/xxx/', shell=True) //引数arg1, arg2をtest.batへ渡して実行。
ちょっとpathlibに時間を取られてsubprocessが尻すぼみになってしまいました。笑
今のところはこのぐらいで良さそうなので、また必要があれば更新させていただければと思います。
下記のサイトを参考にさせていただきました。ありがとうございました。