用于脚本输入和退出的Python脚本

时间:2013-02-27 23:37:58

标签: python

我正在尝试创建一个python脚本,只需单击一个按钮就会打开另一个python脚本并自行关闭,并在第二个脚本中返回一些函数以返回原始脚本,希望您能提供帮助。

感谢。

1 个答案:

答案 0 :(得分: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解决方案有类似但不完全相同的问题。