92503


以下のように、run.batファイルと、test.exeファイルがあり、run.batをPython経由で実行します。

**run.bat**

[code]

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

**python_test.py**

[code]

    import os
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    
    from os import path
    import subprocess
    
    runPath = path.join(path.dirname(__file__), 'run.bat')
    process = subprocess.Popen(runPath)
    
    import time
    time.sleep(10)
    
    import signal
    import psutil
    try:
        os.kill(process.pid, signal.SIGTERM)
    
    except:
        import traceback
        print(traceback.format_exc())
    
    try:
        parent = psutil.Process(process.pid)
        for child in parent.children(recursive=True):
            child.kill()
        parent.kill()
    except:
        import traceback
        print(traceback.format_exc())
    
[/code]

exeファイルを直接popenで開いた場合は、戻り値でexeファイルのprocess.pidが得られるので強制終了できるのですが、.batファイルを経由するとそれが出来ませんでした。

エラー内容は次の通りです。

[code]

    Traceback (most recent call last):
      File "C:\Users\python_test.py", line 23, in <module>
        parent = psutil.Process(process.pid)
      File "C:\Users\Documents\WPy64-31040\python-3.10.4.amd64\lib\site-packages\psutil\__init__.py", line 332, in __init__
        self._init(pid)
      File "C:\Users\Documents\WPy64-31040\python-3.10.4.amd64\lib\site-packages\psutil\__init__.py", line 373, in _init
        raise NoSuchProcess(pid, msg='process PID not found')
    psutil.NoSuchProcess: process PID not found (pid=10976)
    
[/code]

強制終了用の.batファイルも試して実行してみましたが終了できませんでした。

**taskkill.bat**

[code]

    taskkill /F /T /IM test.exe
    
[/code]

Pythonの実行環境はWinPythonです。  
強制終了させる方法はありますでしょうか？


CC BY-SA 4.0
2022-11-29T14:54:06.717
92502
2022-11-29T23:06:31.733
36446
question
python
.batファイルから起動された.exeファイルを強制終了させたい


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

提示されたソースコード上では、その前に`os.kill(process.pid,
signal.SIGTERM)`で既に終了させているために該当のプロセスが存在しないので例外になっているということでしょう。

`psutil`による`kill()`の処理と`os.kill()`の処理順番を逆にすれば終了出来たとのこと。

* * *

ただし少し疑問点もあります。

`psutil`による`kill()`の処理で元のプロセスを`parent.kill()`でkillしているように見えるため、処理順番を変えたということはその後に同じ元のプロセスのpidに対して`os.kill()`していることになり、そちらでは例外が発生しなかったのだろうか？
ということです。  
まあ例外が発生していないのなら問題は無いのでしょう。

* * *

もう一つ、参考情報としてこんな記事があります。  
[subprocessを子プロセスまでkillして停止させる
(python)](https://dlrecord.hatenablog.com/entry/2020/07/13/214241)

> Windows  
>  シンプルに`kill()`メソッドを呼べば、シェルが実行した外部コマンドも止まります。
[code]

>     cmd = "some shell command"      # シェル実行のコマンド
>     p = subprocess.Popen(cmd)
>     p.kill()
>  
[/code]

ということなので、質問のソースコードでは`subprocess.Popen()`の戻り値が`process`に格納されているので、もしかしたら`process.kill()`だけですべて終了出来る可能性があります。  
試してみてください。


CC BY-SA 4.0
2022-11-29T23:06:31.733
92503
2022-11-29T23:06:31.733
26370
92502
answer