首页 > 解决方案 > Python子进程:打开一个程序并等待用户保存并关闭它

问题描述

我有一个在 GUI 上启动 excel 文件的代码。然后它由用户更新并关闭。该用户输入稍后由程序使用。所以我希望我的程序等到用户在 GUI 中关闭 excel 文件。我尝试了以下操作,但我猜它只等待程序打开。

import subprocess
loc = "C:\\Users\\Public\\Documents\\Sheet_groups.xlsx"
p = subprocess.Popen(['start',loc],stdout=subprocess.PIPE,shell = True)
p.communicate()

PS:我是编码世界的新手

标签: python-3.xsubprocess

解决方案


您可以使用 psutil(进程和系统实用程序)检查 Excel 进程是否仍处于打开状态。试试这个 :

import psutil
import subprocess
import time
isopen=True

loc = "C:\\Users\\Public\\Documents\\Sheet_groups.xlsx"
p = subprocess.Popen(['start',loc],stdout=subprocess.PIPE,shell = True)
time.sleep(2)
while(isopen):
    isopen="EXCEL.EXE" in (p.name() for p in psutil.process_iter()) 
    time.sleep(2)

print("File closed")

要检查特定窗口是否打开,您可以使用 pywinauto 库安装它。

pip install pywinauto

然后尝试:

import subprocess
import time
from pywinauto import Desktop

isopen=True
loc = "C:\\Users\\Public\\Documents\\Sheet_groups.xlsx"
p = subprocess.Popen(['start',loc],shell = True)
time.sleep(2)

windows = Desktop(backend="uia").windows()

while(isopen):
    isopen="Sheet_groups.xlsx - Excel" in [w.window_text() for w in windows]
    time.sleep(2)
    
print("File closed")

如果你不能使用 pywinauto,你可以试试这个:

import subprocess
import time
import win32gui

isopen=True
loc = "C:\\Users\\Public\\Documents\\Sheet_groups.xlsx"
running=""

def winEnumHandler( hwnd, ctx ):
    global running
    if win32gui.IsWindowVisible( hwnd ):
        running+=win32gui.GetWindowText( hwnd )
    
    

p = subprocess.Popen(['start',loc],shell = True)
time.sleep(2)

while(isopen):
    isopen=win32gui.EnumWindows( winEnumHandler, None )
    isopen="Sheet_groups.xlsx" in running
    running=""
    time.sleep(2)
    
print("File closed")

推荐阅读