在 python 中终止使用 exec(open(file).read()) 运行的程序

Bra*_*ram 1 python tkinter exec sys

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

如何杀死使用 exec(open(file).read()) 运行的文件而不杀死整个程序?

Ofe*_*dan 5

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

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

from subprocess import Popen
p = Popen(['python', filename'])
Run Code Online (Sandbox Code Playgroud)

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

p.kill()
Run Code Online (Sandbox Code Playgroud)

如果您想提供该过程输入或读出其输出,它会变得更加复杂,但这是另一个问题的问题。您可以从这里开始查看如何读取输出:将subprocess.Popen 调用的输出存储在字符串中

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

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

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

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