manabuQiita
@manabuQiita (mnb)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

PythonのSubprocess.run で起動した外部アプリを終了させたい

PythonのSubprocess.run で起動した外部アプリを終了させたい

現在の実装

Pythonでいろいろな処理を自動化しており、その中に外部アプリケーションでテキストファイルを変換する処理があります。PythonのライブラリSubprocessのrunを使って外部アプリケーションを起動し、変換しています。

困っていること

変換自体はうまくいき、処理全体としても正常に動作するのですが、外部アプリケーションが開いたままになっており、次に実行するとエラーになってしまいます。

やりたいこと

毎回外部アプリを手で閉じてからPythonモジュールを起動しているのですが、できれば処理の最後に自動的に閉じたいです。起動させる処理は情報が沢山あるのですが、停止する処理が見つけられず、戻り値のCompletedProcessインスタンスもリターンコードやエラーを吐く場所のみのメソッドしかないように見えます。

現在の実装

XXX
cp = subprocess.run(['start', APPFILE , shell=True ,stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL)
XXX

よろしくお願いします。

2

1Answer

shell=True をやめてみてはいかがでしょうか。
また、以下例だと期待どおり終了するため、'start'というコマンド自身か、その扱いに問題があるかと思います。

import subprocess
subprocess.run(["ls", "-l"])

別の書き方だとこちらが参考になると思います。
https://takuya-1st.hatenablog.jp/entry/2016/04/11/044313

もしくは、PIDを出力して次回起動時にPIDがすでにあればKILLするなども良いと思います。

2Like

Comments

  1. @manabuQiita

    Questioner

    ありがとうございます!
    詳細かけてなくて申し訳ありませんでしたが、ここで起動したアプリの終了を待たず次の処理へ遷移させたかったのです。全ての処理が完了した時に最後にここで起動したアプリも終了させたかったのです。
    ご教示頂いたURLも参考に、Popenで実装するようにしたらうまくいきました。ありがとうございます!

    # 外部アプリ起動
    cp = subprocess.Popen([APP_PATH , EXECUTE_FILE_NAME ])

    (そのほかの処理・・・)

    # 外部アプリ終了
    cp.terminate()

Your answer might help someone💌