如何在Python中调用程序而不等待其返回

34 投票
3 回答
76454 浏览
提问于 2025-04-15 21:23

有没有办法从Python中调用一个程序,而不需要等它执行完再继续?我写了一个脚本,它会把一个程序复制到某个文件夹,然后运行这个程序。但是当我从Python调用这个程序时,Python脚本会一直等到我启动的程序结束后才继续执行。我试过使用os.system和Popen,但还是不行。还有其他方法吗?

补充信息:使用os.spawnl和os.P_DETACH也不行;根据文档,“P_DETACH类似于P_NOWAIT,但新进程与调用进程的控制台是分开的”。但我发现它还是和我的调用进程有关系(调用的脚本在任何被调用的可执行文件返回之前不会退出)。

程序:

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

在执行完test.exe后,它会打印“完成”。但是它并没有终止脚本的执行(脚本进程仍在运行)。我试过创建一个守护线程和使用Popen加上P_DETACH,结果还是不行。

3 个回答

3

使用 poll() 而不是 wait() 来处理 Popen 时,程序不会被阻塞,也就是说它不会等着另一个程序运行完。不过,我觉得要想彻底让整个程序不再等待,最好的办法是创建一个守护线程来启动这个进程。这样你就不需要再等它了。

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

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

我也遇到过同样的问题,但在这里找到的答案对我来说不太管用。经过研究文档后,我找到了解决办法:https://docs.python.org/3/library/os.html#os.spawnv

import os

filepath = "c:\\a\\b.exe"
process_id = os.spawnv(os.P_NOWAIT , filepath , ["-someFlag" , "someOtherFlag"])
print(process_id)

这个方法可以启动我的可执行文件,并且可以传递命令行参数,而且不会等这个进程结束,只要它被创建就行了。这是在Windows系统上,用的是Python 3.10。

5

在Windows系统中,如果你使用命令行的START命令来启动程序,你可以“释放”父进程,让它可以退出。你可以在命令提示符下输入START /?来了解更多信息。

撰写回答