在 python 中用 exec(open(file).read()) 杀死程序 运行

Kill program run with exec(open(file).read()) in python

在我的代码中,我从 tkinter gui 调用管道。当用户按下 运行 按钮时,整个管道开始 运行。如果选择了某些设置,则会调用主 GUI 的顶层,这会要求提供附加文件。这一切都有效,除非按下取消按钮或关闭 window X。顶层关闭但程序保持 运行。最终它会因为文件不存在而崩溃。调用 sys.exit() 不是解决方案,因为这样整个 gui 都会关闭,我只想关闭特定的顶层并停止 运行 文件。

如何在不终止整个程序的情况下终止文件 运行 exec(open(file).read())?

老实说,你可能根本不应该使用 exec,但假设你这样做了,exec 仍然 运行ning 在与你的主程序相同的进程和线程中,不杀死主程序就无法退出。

您应该在另一个进程、子进程或线程中打开它。由于您的 exec 似乎是 运行ning python 代码,您可以简单地使用:

from subprocess import Popen
p = Popen(['python', filename'])

然后它 运行 在后台运行,您的正常进程继续,您可以随时使用 .

终止它
p.kill()

如果你想给那个过程输入或读出它的输出,它会变得更复杂,但这是另一个问题的问题。您可以从这里开始查看如何读取输出:Store output of subprocess.Popen call in a string

获取输出的一个小例子如下:

from subprocess import Popen, PIPE
p = Popen(['python', filename], stdout=PIPE, stderr=PIPE)
output, errors = p.communicate()

然而,这将等到进程完成其 运行,因此可能从另一个线程开始所有这些,或者找到另一种获取输出的方法(可能到日志文件)

请注意,我在 Popen 中只使用了 'python',如果 python 可执行文件不在您的路径中或具有不同的名称,您应该将其替换为完整路径可执行