Zombie xlwings Python进程在关闭excel后挂起



是否有办法从VBA杀死挂僵尸xlwings Python进程之前或关闭Excel后?我很高兴从VBA或Python中获得解决方案,我真的不介意哪个。

例如,在VBA中,我可以做以下事情,但这并不精确,我需要杀死特定的Python进程,即那些由xlwings产生的进程和那些连接到特定工作簿的进程,即在文件名中包含MyWorkbook.xlsx的进程。有没有一种更精确地使用TASKKILL的方法?

Private Sub Workbook_Open()
Dim KillPython As String
KillPython = "TASKKILL /F /IM Python.exe"
Shell KillPython, vbHide

'do more stuff, now I can safely rely that there are no
'automation errors coming from xlwings' zombie processes
RunPython("import mymodule; mymodule.do_stuff()")

End Sub

在Python中我可以做以下更精确的操作:

import os
import psutil
my_pid = os.getpid()
my_proc = None
for p in psutil.process_iter():
if 'python' in p.name() and 'MyWorkbook' in ' '.join(p.cmdline()):
if p.pid != my_pid:
p.kill()
else:
my_proc = p
# finally try to kill self, if needed
my_proc.kill()

这里似乎有my_pid和我得到的p之间的关系,因为有时它满足条件p.pid != my_pid,但它杀死当前进程。当我匹配进程名时,可能存在父子进程关系。

另一个问题,为什么xlwings总是触发创建两个Python进程而不是一个?

尝试:

import subprocess
subprocess.call(["taskkill", "/f", "/im", "EXCEL.EXE"])

最新更新