【问题标题】:how to call a program from python without waiting for it to return如何从 python 调用程序而不等待它返回
【发布时间】:2011-02-05 19:41:13
【问题描述】:

有没有办法从 python 调用程序而不等待它返回?我创建了一个脚本,它将程序复制到目录并运行该程序。但是当我从 python 调用程序时,python 脚本在我启动的程序退出之前不会退出。我试过 os.system 和 Popen。还有其他方法吗?

添加信息: os.spawnl 和 os.P_DETACH 仍然不起作用;根据文档,“P_DETACH 类似于 P_NOWAIT,但新进程与调用进程的控制台分离”。但它仍然以某种方式附加到我的调用进程(调用脚本在任何被调用的可执行文件返回之前不会退出)

程序:

os.system("start test.exe")
print "Done"

在它执行 test.exe 之后,它会打印 Done。但它不会终止脚本的执行(脚本进程仍在运行)。尝试创建一个守护线程并使用 P_DETACH Popen,仍然不行。

【问题讨论】:

  • 我建议您将问题缩小为一个演示问题的小程序(应该只需要六行代码),然后将其粘贴到您的问题中。事情可能出错的可能性太多了,我们不知道该说什么......

标签: python command subprocess popen


【解决方案1】:

在 Windows 下,如果您使用 shell START 命令调用程序,您应该能够“释放”父进程并允许它退出。在 DOS 提示符下尝试 START /? 以了解更多信息。

【讨论】:

  • 试过这样做,但还是不行。用 Popen 和 os.system 试了一下。
  • 好吧,开始 确实 工作,并且应该(我相信)我描述的方式,所以没有示例代码或描述它不起作用的方式,我不能再帮忙了。我的意思是,它会启动您的程序但您的 Python 应用程序无法退出吗?或者你甚至不能让它启动你的程序?你传递了什么论据?
  • 开始确实有效。但不知何故,将它与 python 一起使用不会。编辑了问题,但只是为了澄清一下,python 程序是:

    os.system("start test.exe")

    print "Done"

    它启动 test.exe,并打印 Done。但脚本并没有停止执行,似乎该进程仍然与 test.exe 相关联。

  • 它一定是你的 test.exe 程序的特殊性质。我在这里以各种方式尝试过,而 START 总是完全按照你说的去做......不幸的是,我想你必须使用我的电脑才能获得相同的结果。 ;-)
【解决方案2】:

通过在Popen 上使用poll() 而不是wait(),它不会阻塞,也不会等待程序运行。但是,我认为真正阻止整个程序等待的唯一方法是创建一个启动进程的守护线程。这样您就不必等待它了。

class MyThread(threading.Thread):
    def run(self):
        '''Start your thread here'''
        pass

thread = MyThread()
thread.daemon = True
thread.start()

【讨论】:

  • 谢谢。我尝试过使用子进程,但是当我在 Popen 上设置 shell=True 时,它​​在 eclipse+pydev 下完美运行,但在 py2exe 上构建为可执行文件时不会运行。我猜这与我用 32 位 python 构建的 py2exe 存在冲突,而实际命令被称为 64 位构建。无论如何,我也许可以解决这个问题。不过,脚本仍然没有退出。
  • @maranas:在这种情况下,您可以简单地创建一个新线程并从那里生成进程。将thread.daemon 设置为True,它不会在退出时停止您的进程:)
  • 再次感谢您的快速回复。它应该可以工作,但不知何故主脚本没有终止。它只是执行完成,但不会终止
猜你喜欢
  • 2012-06-27
  • 2021-07-20
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多