17

をお願いします:

  1. プロセス (myexe.exe arg0) から新しいプロセス (myexe.exe arg1) を起動します。
  2. この新しいプロセスの PID を取得します (OS Windows)
  3. タスク マネージャーの Windows コマンド「プロセス ツリーの終了」で最初のエンティティ (myexe.exe arg0) を強制終了すると、新しいエンティティ (myexe.exe arg1) が強制終了されない必要があります...

私はsubprocess.Popen、os.exec、os.spawn、os.system...で遊んだことがありますが、成功しませんでした。

問題を説明する別の方法: 誰かが myexe.exe (arg0) の「プロセス ツリー」を強制終了した場合、myexe.exe (arg1) を保護するにはどうすればよいですか?

編集: 同じ質問 (回答なし) HERE

編集: 次のコマンドは、サブプロセスの独立性を保証しません

subprocess.Popen(["myexe.exe",arg[1]],creationflags = DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP,close_fds = True)
4

3 に答える 3

12

Windows で親プロセスが終了した後も引き続き実行できる子プロセスを開始するには、次のようにします。

from subprocess import Popen, PIPE

CREATE_NEW_PROCESS_GROUP = 0x00000200
DETACHED_PROCESS = 0x00000008

p = Popen(["myexe.exe", "arg1"], stdin=PIPE, stdout=PIPE, stderr=PIPE,
          creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
print(p.pid)

Windows プロセス作成フラグはこちら

よりポータブルなバージョンはこちらです。

于 2013-02-10T11:53:35.093 に答える
1

私は数年前にWindowsで同様のことをしましたが、私の問題は子プロセスを強制終了したいということでした。

を使ってサブプロセスを実行できると思うpid = Popen(["/bin/mycmd", "myarg"]).pid ので、本当の問題が何であるかわからないので、メインプロセスを強制終了したときだと思います。

IIRCそれは旗と関係がありました。

私はWindowsを実行していないので、それを証明することはできません。

subprocess.CREATE_NEW_CONSOLE
The new process has a new console, instead of inheriting its parent’s console (the default).

This flag is always set when Popen is created with shell=True.

subprocess.CREATE_NEW_PROCESS_GROUP
A Popen creationflags parameter to specify that a new process group will be created. This flag is necessary for using os.kill() on the subprocess.

This flag is ignored if CREATE_NEW_CONSOLE is specified.
于 2013-02-10T11:36:36.153 に答える