我想要:
从我的进程(myexe.exe arg0)启动一个新进程(myexe.exe arg1)
检索这个新进程的PID(os windows)
当我使用TaskManager Windows命令"结束进程树"杀死我的第一个实体(myexe.exe arg0)时,我需要新的(myexe.exe arg1)不会被杀死...
我玩过subprocess.Popen,os.exec,os.spawn,os.system ......但没有成功。
另一种解释问题的方法:如果有人杀死了myexe.exe(arg0)的"进程树",如何保护myexe.exe(arg1)?
编辑:同样的问题(没有答案)在这里
编辑:以下命令不保证子进程的独立性
subprocess.Popen(["myexe.exe",arg[1]],creationflags = DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP,close_fds = True)
你有任何示例代码到目前为止你做了什么?
相关:即使直系孩子已经终止,Popen仍在等待孩子的过程
可能重复从Python启动一个完全独立的进程
要启动在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进程创建标志在这里
这里有一个更便携的版本。
不错的尝试!但是当我通过Windows的"结束进程树"taskmanager命令杀死"myexe.exe"(arg0)时,两个myexe.exe都被杀了!如果我在"myexe.exe"(arg1)上执行相同的命令,则只会杀死此实体...
@baco:使用仅杀死一个进程而不是"进程树"的选项。
可能两个方向都遍历了进程树。
@JF Sebastian:问题=>如果有人杀了myexe.exe(arg0)的"进程树",如何保护myexe.exe(arg1)(解决方案似乎使用os.startfile但我不能使用args!)
@baco:尝试从arg0启动一个中间进程X,它只会启动arg1并立即退出(您可以通过X s stdout读取arg0中的孙的pid)。
@ J.F.塞巴斯蒂安:我的问题没有简单回答(参见我的编辑)
@baco:按原样从我的答案中尝试命令(不带close_fds)。您是否尝试过我之前评论中的双叉变体?
@ J.F. Sebastian:即使没有"close_fds"或双叉,我也可以杀死myexe.exe ......
@ J.F. Sebastian:我觉得双叉因为windows os不起作用,不是吗?
@baco:我应该把"双叉"放在引号中。我只是意味着两次使用Popen(创造孩子,创造孙子,退出孩子)。虽然这可能毫无意义。
如果有人发现它有用,在我执行批处理脚本的情况下,我使用1. DETACHED_PROCESS = 0x00000008,2。Cmd = ["cmd.exe","C", RunScript, arg1, arg2, arg3],然后3. subprocess.Popen(Cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, creationflags=DETACHED_PROCESS)似乎按预期工作,只需执行带命令和传递的批处理脚本在论点中。我得到奇怪的结果,例如findstr命令为批处理脚本中使用的每个命令打开一个新窗口subprocess.Popen(),直到我使用这个语法然后它工作。
所以,如果我理解你,代码应该是这样的:
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)
至少我试过这个并为我工作。
几年前我在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.