pythonプログラム自身によるpythonプログラムの生成
プログラムでやる以上ミスは付き物だと思いますが、コーディングの半自動化、設定ファイルの記載変更など定型的に書き換えるプログラム(あるいはそれに準ずるもの)などを一括変更する用途でイメージしました。
with open~で*.pyとして書き込む
プログラムといってももとはテキストデータですから、以下のようにpythonプログラムからpythonプログラムを作成することができます。
ここではexample01.pyによって、new_example01.pyを生成しています。
example01.py
data = """
print("hello")
"""
with open("./new_example01.py",mode="w") as f:
f.write(data)
new_example01.py
print("hello")
自分自身のコードを読み込む
「__file__」によって自分自身のコードを読み込みます。
※環境によって、違うファイルパスの取り方が必要になるかもです。
以下は、example02.pyをnew_example02.pyとして、コピーした例です。
example02.py
# 自分自身のファイルパスを取得
myself_path = __file__
# 自分のスクリプトを読み込み
with open(myself_path, "r", encoding="utf-8") as f:
code = f.read()
# 書き込み
new_file_path = "new_example02.py"
with open(new_file_path, "w", encoding="utf-8") as f:
f.write(code)
print(f"コードが {myself_path} に保存されました。")
new_example02.py
# 内容は同じなので省略する
コードの一部を書き換える
いろいろな方法が考えられますが、ここではcodeの中に代入されたテキストデータを正規表現を使って書き換えます。コメント文を目印にして、正規表現で書き換えています。
import re
# 変更元コード
def hogehoge():
# StartPoint01
print("ugougo")
# Endpont01
# 自分自身のファイルパスを取得
myself_path = __file__
# 自分のスクリプトを読み込み
with open(myself_path, "r", encoding="utf-8") as f:
code = f.read()
# 置換するコード
replace_code = """
print("hugahuga")
"""
# StartPoint01からEndpont01までの内容をreplace_codeに置換する
code = re.sub(r"# StartPoint01(.*?)# Endpont01",
f"# StartPoint01{replace_code} # Endpont01",
code,
flags=re.DOTALL,count=1)
# 書き込み
new_file_path = "new_example03.py"
with open(new_file_path, "w", encoding="utf-8") as f:
f.write(code)
print(f"コードが {myself_path} に保存されました。")
結果
new_example03.py
import re
def hogehoge():
# StartPoint01
print("hugahuga") # 正規表現による変更点
# Endpont01
# 以下略
まとめ
GUIから設定ファイルを変更できるプログラムを作ろうと思って考えました。
何かの足しになれば幸いです。