win python 判断 所有 子进程 结束_关于windows:Python:如何启动完整进程而不是子进程并检索PID...

我想要:

从我的进程(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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值