在我的代码中,我从tkinter gui调用管道。当用户按下运行按钮时,整个管道开始运行。如果选择了某些设置,则将调用主GUI的顶层,要求提供附加文件。除了按下取消按钮或关闭窗口X以外,所有其他操作均有效。顶层关闭,但程序继续运行。最终,它将由于文件不存在而崩溃。调用sys.exit()并不是解决方案,因为然后整个GUI都将关闭,而我只希望关闭特定的顶层并停止正在运行的文件。
如何在不杀死整个程序的情况下杀死使用exec(open(file).read())运行的文件?
答案 0 :(得分: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可执行文件不在您的路径中或具有其他名称,则应将其替换为可执行文件的完整路径