EDW*_*yte 5 python windows shell subprocess
我正在使用打开一个程序 subprocess.Popen
import subprocess
prog = subprocess.Popen(['myprog', args], shell=True)
我想监视进程'myprog'并等待它直到我的代码继续之前它终止.
我面临的问题是prog.pidshell的PID而不是'myprog',我不知道如何获得'myprog'的PID.我试图用来psutil找到子进程prog.pid:
parent = psutil.Process(prog.pid)
children = parent.children(recursive=True)
但是返回一个空列表.
不幸的是,如果没有shell,我无法启动'myprog'.当我运行该命令时,shell=False我收到以下错误消息:
FileNotFoundError: [WinError 2] The system cannot find the file specified
我搜索网络的高低,但所有有前途的线索都是针对非Windows用户的.
您的atom命令可能是一个.cmd启动可执行文件的文件,这解释了需要shell=True
您不会在 python 中对 .bat 文件进行重新编码,但也不需要可执行的 PID。
如果可执行文件结束,则批处理文件结束,因此忘记监视prog.pid,只需监视progusing poll(当然在同一个 python 脚本中)。
该poll方法允许检查进程是否已结束(如果已结束,则返回退出代码,如果未结束则返回None),并且这是非阻塞的,因此您可以随时执行此操作:
if prog.poll() is not None:
# process has ended
print("ended")
Run Code Online (Sandbox Code Playgroud)
让我们提醒一下阻塞等待:
return_code = prog.wait()
Run Code Online (Sandbox Code Playgroud)
但在你的情况下,该atom.cmd命令似乎在后台启动该进程,因此无法在没有 PID 的情况下进行监控。
在这种情况下,解决方法是制作 的副本atom.cmd,删除start前缀以在前台运行可执行文件,然后运行副本。
(或者由于您评论时cmd调用另一个文件,因此从原始目录中atom.cmd找到该文件并删除那里的前缀)app-1.13.0\resources\cli\atom.cmdatom.cmdstart