是否有办法从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"])