Windowsバッチファイルの"SET PATH"と同等の処理をPythonから実行したい


以下のようなバッチファイルがあります。  
このバッチファイルを使用せずに、Pythonから同等の処理をしてtest.exeを実行したいです。

**run.bat**

exeファイル実行時には、コマンドライン引数を使用します。

[code]

    SETLOCAL
    SET PATH=%PATH%;..\..\samples\external\opencv\bin;..\..\bin;
    test.exe --view_mode=1
    
[/code]

以下が、Pythonで分かる部分だけ記述したものになります。

**test.py**

[code]

    from os import path
    import subprocess
    
    #exeファイルを実行する部分(コマンドライン引数を呼び出す方法があっているか分かりません。)
    exePath = path.join(path.dirname(__file__), 'test.exe')
    subprocess.Popen([exePath,"--view_mode=1"])
    
[/code]

SET PATHがどのようなことをしているのか理解できていないため、Pythonでの記述方法が分かりません。どうしたら同等の処理を行えますか？




ディレクトリ＆ファイル構成が以前の質問
[Pythonから.batファイルや.vbsファイルを実行したい](https://ja.stackoverflow.com/q/92500/26370)
と同じで、Pythonスクリプトとtest.exeが同じディレクトリにあると仮定すると、コメントで紹介したこれらの記事を適用して、以下のように出来るでしょう。  
[Python のサブプロセスで環境変数を扱う方法](https://hawksnowlog.blogspot.com/2021/06/python-
subproces-with-environment-variables.html)  
[Pythonのサブプロセスを使ったメモ](https://qiita.com/bonk/items/d2f5631683e52e1c39e7)

[code]

    from os import path
    import subprocess
    
    import os
    savedir = os.getcwd() #### 起動時のカレントディレクトリ情報を保存し、必要ならば後で戻す。
    #### カレントディレクトリをPythonスクリプトとtest.exeのあるディレクトリに移動する
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    
    #### 環境変数をコピー(SETLOCALに相当)し、OpenCV等の必要なソフトウェアのディレクトリをPATHに追加する
    subenv = os.environ.copy()
    subenv["PATH"] = subenv['PATH'] + r';..\..\samples\external\opencv\bin;..\..\bin;'
    
    #exeファイルを実行する部分(コマンドライン引数を呼び出す方法があっているか分かりません。)
    exePath = path.join(path.dirname(__file__), 'test.exe')
    subprocess.Popen([exePath,"--view_mode=1"], env=subenv)  #### 起動時のパラメータに変更した環境変数を指定
    
[/code]




一般論として

  * 環境変数 `PATH` はプロセスを起動する際に実行ファイルを検索する対象を示します。
  * 環境変数は子プロセスに引き継がれます。

この２つから、２つの効果が得られます。

  * `test.exe` を起動する際に環境変数 `PATH` の中から検索されます。
  * `test.exe` が更に子プロセスを起動する際、（`test.exe`が明示的に排除しなければ）環境変数 `PATH` の中から検索されます。

質問文ではこの２つの効果のうちどちらを期待するものかわかりませんでした。

前者を期待するのであれば、`test.exe` がどのディレクトリに配置されているのか知っているならば、

>
[code]

>     exePath = path.join(path.dirname(__file__), 'test.exe')
>  
[/code]

で十分です。

後者を期待するのであれば、
[`subprocess.Popen()`](https://docs.python.org/ja/3/library/subprocess.html#popen-
constructor) の `env` 引数に渡すことができます。

* * *

極まれに、環境変数 `PATH` が設定されていないと `test.exe` 自身が正常動作できないことがあります。具体的には `test.exe`
が[DLLを読み込む際にも 環境変数 `PATH` から検索することができ](https://learn.microsoft.com/ja-
jp/windows/win32/dlls/dynamic-link-library-search-order#standard-search-order-
for-desktop-applications)、それに頼っている場合です。このような場合も`subprocess.Popen()` の `env`
引数を設定する必要があります。

