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

问题描述 投票:0回答:1

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

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

python tkinter exec sys
1个回答
2
投票

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

您应该在另一个进程,子进程或线程中打开它。由于您的exec似乎正在运行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()

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

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

© www.soinside.com 2019 - 2024. All rights reserved.