在Windows中如何用Python结束进程?

1 投票
3 回答
2895 浏览
提问于 2025-04-16 12:30

编辑:看起来这个问题和别的重复,但我保证不是。我想要干掉当前正在运行的进程,而不是去杀掉其他的进程。

问题是,我要杀掉的进程并不是通过子进程或执行命令启动的。它其实是在尝试自杀。

场景是这样的:这个程序在退出时会进行清理,但有时候这个过程会花太长时间。我确定我可以终止这个程序,因为退出的第一步是保存数据库。那么我该怎么做呢?

  • 不能使用taskkill,因为在某些Windows版本中,比如XP的家庭版,是没有这个命令的
  • tskill也不管用

  • win32api.TerminateProcess(handle, 0) 有效,但我担心这样会导致内存泄漏,因为我没有机会去关闭句柄(调用TerminateProcess后程序立刻停止)。注意:没错,我是在强制退出,所以肯定会有一些资源没有释放,但我想尽量减少这种情况(因为我只会在程序耗时过长时才这样做,以提升用户体验),但我觉得如果强制退出,Python可能不会处理垃圾回收。

我现在正在使用最后一种方法,因为它有效。不过我还是担心未释放的句柄。任何想法或建议都非常感谢!

3 个回答

1

使用TerminateProcess和taskkill /f命令并不能释放资源,反而会导致内存泄漏。这里有微软的官方说法关于TerminateProcess的内容:{ ... 结束一个进程并不会结束它的子进程。结束一个进程也不一定会把这个进程的对象从系统中移除。只有当最后一个指向这个进程的句柄被关闭时,进程对象才会被删除。 ... }微软在很多地方使用了COM和DCOM,这些技术共享了一些句柄和资源,而操作系统并不能也无法追踪这些资源。如果你不打算频繁重启的话,应该使用ExitProcess。这样可以让进程正确地释放它所使用的资源。Linux就没有这个问题,因为它不使用COM或DCOM。

1

如果我理解你的问题,你是想让程序自己关闭。这通常可以通过 sys.exit() 来实现。

1

win32api.TerminateProcess(handle, 0) 这个命令可以强制结束一个程序,但我有点担心这样会导致内存泄漏,因为我没有机会去关闭这个句柄(程序在调用TerminateProcess后会立刻停止)。注意:没错,我是强制退出它,所以肯定会有一些资源没有释放,但我想尽量减少这种情况(因为我只会在程序运行得让人受不了的时候才这样做,以提高用户体验)。不过我觉得如果强制退出,Python可能不会处理垃圾回收。

如果一个程序自己结束了,那你就不用担心垃圾回收的问题。操作系统会自动清理这个程序使用的所有内存资源,所以你不需要担心内存泄漏。内存泄漏是指一个程序在运行时,随着时间的推移,使用的内存越来越多。

所以,虽然这样结束程序不算“干净”,但也不会有什么坏的副作用。

撰写回答