Python 環境変数Pathのパスを削除・追記する/指定した環境変数を削除・追記する「os.environ」

'20/07/23更新:汎用性を高めたコードに更新しました。
 本記事では、例えば、アプリケーションの動作検証のため、一次的に環境変数を変更してテストしたい場合に有用です。具体的には、稼働中のPythonプロセスにおいて、環境変数Pathのパスを調べるだけでなく、削除や追加したり、Path以外の環境変数も指定して削除や追加したい場合の雛形コードです。
 下図は、Anacondaプロンプトで本コードを実行した例です。動作過程で、Pathに設定されてるパスをprint出力で視覚的に確認してる様子です。

f:id:HK29:20200723122635p:plain

■本プログラム

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os, subprocess

# 環境変数Pathのパスを変更する関数
def replace_path():
    new_path_list=[]
    # 環境変数Pathに登録してあるパスを調べる
    # 文字列で抽出されるため、「;」で分割してリスト化し、それを順番に取り出す
    for mypath in os.environ["Path"].split(';'):
        print(mypath)
        check_flag = 0
        # 部分一致検索を行う方法。一旦、リスト内の要素を順に取り出す
        for target_str in target_list:
            # in演算子で完全一致で検索
            if target_str in mypath:
                check_flag += 1
        if check_flag == 0:
            # リストに追加
            new_path_list.append(mypath)

    for mypath in add_list:
        new_path_list.append(mypath)

    # リストを文字列へ変換する
    new_path_str = ';'.join(new_path_list)

    # パスを書き換える
    os.environ["Path"] = new_path_str
    # 書き換えたPath内容をチェック
    for mypath in os.environ["Path"].split(';'):
        print(mypath)


# 指定した環境変数を削除する関数
def del_path():
    for myenv in del_list:
        print(os.environ[myenv])
        del os.environ[myenv]
        # .getメソッドを使用すると、空の場合にNoneを返す
        print(os.environ.get(myenv))


# 指定した環境変数を作成する関数
def add_path():
    for key, value in add_dict.items():
        print(key, value)
        os.environ[key] = value

if __name__ == '__main__':
    # 削除したいPathに含まれる文字列をリストで設定
    target_list = ['anaconda3', 'Anaconda3']
    # 追加したいパスをリストで設定
    add_list = [r'D:\00_backup\01_new\FreeCAD_0.19.21280-Win-Conda_vc14.x-x86_64\bin']
    
    # 削除したい環境変数名をリストで設定
    del_list = ['PYTHONPATH']
    # 追記したい環境変数を辞書で設定
    add_dict = {'PYTHONHOME':r'C:\Users\usr\Anaconda3\envs\py37'}
    
    ### 関数呼び出し
    replace_path() # Pathに記載されてるパスを削除、追記などを置換で行う
    del_path() # 指定した環境変数名を削除
    add_path() # 指定した環境変数を作成

    print("finished")
    #print(os.environ.get('windir'))

以上

<広告>