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

8 浏览
0 Comments

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

在我的代码中,我从tkinter gui中调用一个流水线。当用户按下“运行”按钮时,整个流水线开始运行。如果选择了某些设置,将调用主GUI的一个toplevel,询问一个附加文件。这一切都有效,除了当按下取消按钮或关闭窗口X时。toplevel关闭了,但程序仍在运行。最终它会崩溃,因为文件不存在。调用sys.exit()不是解决方案,因为那样会关闭整个gui,我只想关闭特定的toplevel并停止运行文件。

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

0
0 Comments

在Python中,如果你使用exec(open(file).read())这样的代码来运行程序,可能会遇到以下问题:

问题的原因:

- 实际上,你可能根本不应该使用exec,因为它存在一些潜在的安全风险。

- exec在同一个进程和线程中运行,没有办法在不杀死主程序的情况下退出它。

解决方法:

- 你应该在另一个进程、子进程或线程中打开它。

- 如果你的exec运行的是Python代码,你可以简单地使用subprocess模块中的Popen方法:

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

这样它就在后台运行,你的正常进程继续进行,你可以随时使用p.kill()来终止它。

- 如果你想给该进程输入或读取其输出,可以参考这里了解如何读取输出。一个简单的例子是:

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

但是这种方法会等待进程完成其运行,如果你想实现异步获取输出,可以考虑在另一个线程中启动该进程,或者将输出写入日志文件。

总之,使用exec运行程序可能会导致一些问题,可以考虑使用subprocess模块的Popen方法来解决这些问题。希望以上的解决方法对你有帮助。如果还有其他问题,可以参考给出的链接或者提出新的问题。

0