0

我正在尝试创建一个 python 脚本,单击一个按钮会打开另一个 python 脚本并关闭自身,并且第二个脚本中的一些返回函数返回到原始脚本希望你能提供帮助。

谢谢。

4

1 回答 1

3

由于您的问题非常模糊,因此这里有一个有点模糊的答案:

首先,想想你是否真的需要这样做。为什么第一个脚本不能import将第二个脚本作为一个模块并在其上调用一些函数?

但是让我们假设您对此有一个很好的答案,并且您确实需要“关闭”并运行另一个脚本,其中“关闭”的意思是“使您的 GUI 不可见”。

def handle_button_click(button):
    button.parent_window().hide()
    subprocess.call([sys.executable, '/path/to/other/script.py'])
    button.parent_window().show()

这将隐藏窗口,运行另一个脚本,然后在另一个脚本完成后再次显示窗口。在事件处理程序中间做一些缓慢和阻塞的事情通常是一个非常糟糕的主意,但在这种情况下,因为我们无论如何都隐藏了整个 UI,所以你可以侥幸逃脱。

更智能的解决方案将涉及第二个脚本发送或观察者线程发送的某种信号。例如:

def run_other_script_with_gui_hidden(window):
    gui_library.do_on_main_thread(window.hide)
    subprocess.call([sys.executable, '/path/to/other/script.py'])
    gui_library.do_on_main_thread(window.show)

def handle_button_click(button):
    t = threading.Thread(target=run_other_script_with_gui_hidden)
    t.daemon = True
    t.start()

显然,您必须用适合您选择的窗口库的代码替换诸如button.window()window.hide()、等之类的东西。gui_library.do_on_main_thread

如果您希望第一个脚本实际退出,而第二个脚本重新启动它,您可以这样做,但这很棘手。您不想将第二个脚本作为子进程启动,而是作为兄弟进程启动。理想情况下,您希望它只接管您自己的流程。除非您需要在执行此操作之前关闭 GUI,除非您的操作系统会自动执行此操作(基本上,Windows 会,Unix 不会)。看看这个os.exec系列,但你真的需要了解这些东西在 Unix 中是如何工作的才能正确地完成它。除非您希望两个脚本紧密耦合在一起,否则您可能希望在命令行上传递第二个脚本,正确的参数来重新启动第一个脚本(基本上,sys.argv在任何其他参数之后传递整个脚本)。

作为替代方案,您可以使用execfile在现有解释器实例中运行第二个脚本,然后让execfile您返回第二个脚本。这与解决方案有相似但不相同的问题exec

于 2013-02-27T23:42:04.770 回答