近来在搞根据yaml格式的文件,由yaml中输入的内容转换为Excel文件,使用xlwings模块,但是发现最后虽然使用app.kill(),但是还是有多个excel.exe进程占用,最初没有发现原因,使用以下方法解决:
......
# 保存文件并关闭
self.wb.save("xxx.xlsx")
self.wb.close()
self.app.kill()
# 手动终止excel进程
os.system("taskkill /f /im EXCEL.EXE")
但是这样会有一个问题,它会终止正在运行的所有excel进程,如果正在编辑的excel没有保存,就会丢失内容。
解决办法:
后面通过打印app.pid发现多出来不能通过app.kill()终止的进程是由于读取yaml时,我单独创建了一个函数,后面在写入excel的函数中调用,会执行类下的__init__方法,这样就新增了一个app进程。
解决办法就是删除读取yaml的函数,直接写在写入excel的函数中
,之后正常通过app.kill()结束就可以了。
如下,将下面
class A:
......
def read_yaml(self):
"""
读取yaml文件
"""
with open("xxx.yaml", "r") as f:
data = f.read()
return yaml.load(data, Loader=yaml.Loader)
def write_xls(self):
"""
写入excel
"""
conent = A().read_yaml()
...
改为:
class A:
......
def write_xls(self):
"""
写入excel
"""
with open("xxx.yaml", "r") as f:
data = f.read()
conent = yaml.load(data, Loader=yaml.Loader)
......
......
# 保存文件并关闭
self.wb.save("xxx.xlsx")
self.wb.close()
self.app.kill()
其实解决也简单,只是找到是哪里的问题有点麻烦。。。