19

I would like:

  1. Launch a new process (myexe.exe arg1) from my process (myexe.exe arg0)
  2. Retrieve the PID of this new process (os windows)
  3. when I kill my first entity (myexe.exe arg0) with the TaskManager Windows Command "End process tree", I need that the new one (myexe.exe arg1) will not be killed...

I've played with subprocess.Popen, os.exec, os.spawn, os.system... without success.

Another way to explain the problem: How to protect myexe.exe (arg1) if someone kills the "process tree" of the myexe.exe (arg0)?

EDIT: same question (without answer) HERE

EDIT: the following command do not guarantee the Independence of the subprocess

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

4 Answers 4

14

To start a child process that can continue to run after the parent process exits on 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 process creation flags are here

A more portable version is here.

Sign up to request clarification or add additional context in comments.

12 Comments

nice try! But when I kill the "myexe.exe" (arg0) through "End process tree" taskmanager command of windows, both myexe.exe were killed ! If I've done the same command on the "myexe.exe" (arg1) only this entity will be killed...
@baco: Use the option that kills only one process instead of "process tree".
Probably the process tree is traversed in both directions.
@JF Sebastian: that the question => how to protect myexe.exe (arg1) if someone kill the "process tree" of the myexe.exe (arg0) (the solution seems to use os.startfile but I can't use args!)
The windows process creation flags are (now) also available as subprocess windows constants.
|
1

I did similar a couple of years ago on windows and my issue was wanting to kill the child process.

I presume you can run the subprocess using pid = Popen(["/bin/mycmd", "myarg"]).pid so I'm unsure what the real issue is, so I'm guessing it's when you kill the main process.

IIRC it was something to do with the flags.

I can't prove it as I'm not running 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. 

Comments

1

So if I understand you right the code should go like this:

from subprocess import Popen, PIPE script = "C:\myexe.exe" param = "-help" DETACHED_PROCESS = 0x00000008 CREATE_NEW_PROCESS_GROUP = 0x00000200 pid = Popen([script, param], shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP) 

At least I tried this one and worked for me.

1 Comment

Why DETACHED_PROCESS = 0x00000008 ?
1

I have tried all the proposed solutions for Windows 10 but all of them still open the new process as part of the original processes' process tree (either directly below the main process or with a cmd shell in between). The only solution that is working for me is to create a fully independent process/fork using the cmd.exe's start command:

import subprocess subprocess.Popen(["cmd.exe", "/C", "start notepad"]) 

This is actually even easier as it requires no mangling with stdin/out parameters. Obviously, since it is completely independent, you cannot communicate with it. But you can use psutil to retrieve it's PID to at least monitor or close it, if necessary:

import psutil for process in psutil.process_iter(): if process.name() == 'notepad.exe': print(process.pid) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.