92501


次の画像のようにファイルが配置されているとします。

[![画像の説明をここに入力](https://i.stack.imgur.com/zrXvf.png)](https://i.stack.imgur.com/zrXvf.png)

各ファイルの中身を以下に示します。

**python_test.py**  
python_tes.pyは.batファイルや、.vbsファイルを呼び出します。

[code]

    from os import path
    import subprocess
    
    #パターン1 .batファイルを呼び出す
    runPath = path.join(path.dirname(__file__), 'run.bat')
    subprocess.Popen(runPath)
    
    #パターン2 .vbsファイルを呼び出す
    #vbsPath = path.join(path.dirname(__file__), 'noConsoleRun.vbs')
    #subprocess.Popen(r'wscript "'+vbsPath+'"')
    
[/code]

**run.bat**  
run.batは環境変数の設定をしてexeファイルを実行します。

[code]

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

**noConsoleRun.vbs**  
noConsoleRun.vbsは、.batファイルで表示される黒いコンソールウインドウを消すために使用します。

[code]

    Set ws = CreateObject("Wscript.Shell")
    ws.run "cmd /c run.bat", vbhide
    
[/code]

実際に、python_test.pyを実行すると、パターン1の.batファイル実行では次のようなエラーが出ます。

[code]

    'test.exe' is not recognized as an internal or external command,operable program or batch file.
    
[/code]

パターン2の.vbsファイル実行ではエラーは出ないものの、何も実行されおらずコンソール以外のGUIも出てきません。

それぞれ、Pythonから実行せずに手動でrun.batやnoConsoleRun.vbsをダブルクリックすると普通に起動します。Pythonから実行した場合のみ、起動しません。

どうしたらPythonから実行できそうでしょうか？


CC BY-SA 4.0
2022-11-29T11:53:14.933
92500
2022-11-29T14:06:02.927
36446
question
python
Pythonから.batファイルや.vbsファイルを実行したい


コメントで解決したようなので、内容を回答として記述しておきます。

一応後から示したバッチファイルでの対策だけで動作しそうですが：

以下のように`run.bat`の先頭あるいは何処でも`test.exe`を実行する前に`CD /D
%~dp0`を挿入してバッチファイルの存在するディレクトリをカレントディリクトリに変更します。

[code]

    CD /D %~dp0
    SETLOCAL
    SET PATH=%PATH%;..\..\samples\external\opencv\bin;..\..\bin;
    test.exe
    
[/code]

もしかしたらPython,
VBSどちらかで処理を起動出来ない？ことがあるかもしれないので、その場合は以下の記事を参考に、Pythonスクリプトの先頭でもスクリプトのあるディレクトリをカレントディレクトリに変更しておきます。  
[Pythonでカレントディレクトリをスクリプトのディレクトリに固定](https://qiita.com/moisutsu/items/46c7b29b1f68a83f6ec8)

>
[code]

>     import os
>     os.chdir(os.path.dirname(os.path.abspath(__file__)))
>  
[/code]


CC BY-SA 4.0
2022-11-29T14:06:02.927
92501
2022-11-29T14:06:02.927
26370
92500
answer