python - 批处理文件在被Python创建和写入后没有关闭?
问题描述
我的代码基本上是创建一个.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()
我做了一些研究,发现在我的代码中添加with
或close()
可能会解决问题,但它没有做任何事情,我仍然收到错误消息。难道我做错了什么?我的猜测是我没有指定确切的文件路径,但是该文件与 python 脚本位于同一目录中,所以我觉得好像我不需要指定确切的路径。任何帮助将不胜感激。
解决方案
您最初的 batfile.close() 调用是不必要的:with 块确保文件在退出块时关闭。但是,您以后的循环会在每次通过循环时打开文件的新句柄,并且永远不会关闭它们。您可能会考虑将循环重写为:
with open("kill.bat", "a") as newbatfile:
for line in processlist:
newdata = line.replace("\n", "")
newbatfile.write(...)
或者更好的是,只需将循环放在原始块中。
推荐阅读
- amazon-web-services - 如果缺少 s 标签值,则不允许用户创建任何 ec2 实例
- rust - 使用带有字符串 url 的 std::net::UdpSocket
- jsx - After Effects 从 JSX 更改表达式变量
- vue.js - vue 2 @click 处理程序未按预期工作
- shell - 为多个输入参数文件调用 jar 的 Cron 作业
- php - Composer 使用 OR 运算符更新包到特定版本
- c# - 如何从带有连接表的数据库动态创建 WPF 窗口?
- sql-server - 在一个数据库中检查约束失败
- java - 当我传递 URI 时,音乐文件可以正常工作,但是当我传递字符串路径时它不起作用。为什么?
- python - 如何使用Python在多个进程中运行pycuda