python-3.x - 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:我是编码世界的新手
解决方案
您可以使用 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")
推荐阅读
- java - 在 Spring Cassandra 存储库查询中返回嵌套的 UDT
- python - 关于 Python 中的左侧绑定
- php - 如何在 Laravel excel 中验证多个工作表?
- haskell - 理解这个简单的 Reader monad 示例
- c - Linux 设备驱动程序未按预期运行
- python - 模拟 pytest 列表中存在的函数
- preconditions - 金牛座特定场景的前置条件
- css - 如何使 `:active::after` 像 `:hover::after` 一样工作?
- android - 错误应用程序:dataBindingGenBaseClassesDebug,Android Stuio ViewBinding
- netty-socketio - 如何集成netty-socketio和redisson