windows Python:如何启动一个完整的进程而不是子进程并获取PID

sigwle7e  于 2023-03-19  发布在  Windows
关注(0)|答案(4)|浏览(261)

我想:
1.从我的进程(myexe.exe arg0)启动新进程(myexe.exe arg1)
1.检索此新进程的PID(OS Windows)
1.当我使用TaskManager Windows命令“结束进程树”终止我的第一个实体(myexe.exe arg0)时,我需要新实体(myexe.exe arg1)不会被终止...
我试过使用子进程。Popen,os.exec,os.spawn,os.system ......都没有成功。
另一种解释这个问题的方法是:如果有人杀死myexe.exe(arg0)的“进程树”,如何保护myexe.exe(arg1)?
编辑:相同问题(无答案)HERE
EDIT:以下命令不保证子进程的独立性

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

cbeh67ev1#

要在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进程创建标志为here
A more portable version is here .

tf7tbtn2

tf7tbtn22#

几年前我在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.
cuxqih21

cuxqih213#

如果我没理解错的话代码应该是这样的:

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)

至少我试过这个了而且很管用。

hpxqektj

hpxqektj4#

我已经尝试了所有建议的Windows 10解决方案,但所有建议的解决方案仍然将新进程作为原始进程的进程树的一部分打开(直接位于主进程之下,或者在主进程之间使用cmd shell)。唯一对我来说,创建完全独立的进程的解决方案是使用cmd.exe启动命令将其分叉:

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

这实际上更简单,因为它不需要使用stdin/out参数进行mangling。显然,由于它是完全独立的,因此您无法与它通信。但如果需要,您可以使用psutil检索它的PID,以便至少监视或关闭它:

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

相关问题