由Python创建并写入批处理文件后未关闭?

时间:2018-12-13 20:07:34

标签: python python-3.x batch-file subprocess popen

我的代码基本上创建了一个.bat文件,在其中写入了一些文本,然后使用Popen运行它。但是我得到这个错误:

  

PermissionError:[WinError 32]该进程无法访问文件,因为该文件正在被另一个进程使用

这就是我所拥有的:

def killProcesses(self):
    processlist = open("processes.txt")
    with open("kill.bat", "w") as batfile:
        batfile.write("""echo off
cls
""")
    batfile.close()
    for line in processlist:
        newbatfile = open("kill.bat","a")
        newdata = line.replace('\n','')
        newbatfile.write("""
Taskkill /IM """+newdata+""" /F""")
    p = Popen("kill.bat")
    stdout,stderr = p.communicate()
    processlist.close()

我做了一些研究,发现在我的代码中添加withclose()可能会解决问题,但是它什么也没做,我仍然遇到错误。难道我做错了什么?我的猜测是我没有指定确切的文件路径,但是该文件与python脚本位于同一目录中,因此我感觉好像不需要指定确切的路径。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您不需要最初的batfile.close()调用:with块可确保退出该块时关闭文件。但是,以后的循环在每次循环时都会打开文件的新句柄,并且永远不会关闭它们。您可以考虑将循环重写为:

with open("kill.bat", "a") as newbatfile:
    for line in processlist:
        newdata  = line.replace("\n", "")
        newbatfile.write(...)

或更妙的是,只需将循环放在带有block的原始文件中即可。