見出し画像

【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が尻すぼみになってしまいました。笑
今のところはこのぐらいで良さそうなので、また必要があれば更新させていただければと思います。

下記のサイトを参考にさせていただきました。ありがとうございました。

参考文献

いいなと思ったら応援しよう!