运行一个进程并退出而不等待它

时间:2009-11-11 23:50:29

标签: python windows

在Windows下的Python中:我想在一个单独的进程中运行一些代码。而且我不希望父母等待它结束。试过这个:

from multiprocessing import Process
from time import sleep

def count_sheeps(number):
    """Count all them sheeps."""
    for sheep in range(number):
        sleep(1)

if __name__ == "__main__":
    p = Process(target=count_sheeps, args=(5,))
    p.start()
    print("Let's just forget about it and quit here and now.")
    exit()

启动子进程并继续执行。但是,当父母到达终点时,它仍然等待孩子退出。

即使孩子在跑步,有没有办法让父母退出?当然,我可以使用subprocess.Popen运行一个新的python解释器,并将羊计数作为一个单独的脚本提供给它。

尽管如此,还有整个模块用于播放Python代码的过程,所以我想利用它而不是黑客攻击操作系统。此外,如果相同的代码在Python所处的任何地方都有效,那将是非常棒的,而不仅仅是在Windows上。

6 个答案:

答案 0 :(得分:4)

使用subprocess模块,因为其他子进程控制方法(os.system,os.spawn *,os.popen *,popen2。,命令。)已被弃用:

from subprocess import Popen
Popen( [ "foo.exe", "arg1", "arg2", "arg3" )

See the Python doco,尤其是P_NOWAIT示例。

你必须在子进程中启动一个新的Python解释器,所以上面的“foo.exe”可能是“python.exe”。

编辑:

刚刚审阅了多处理模块文档:

  

join_thread() :加入后台   线。这只能在以后使用   已经调用了close()。它阻止   直到后台线程退出,   确保缓冲区中的所有数据   已被冲到管道上。

     

默认情况下,如果进程不是   队列的创建者然后退出它   将尝试加入队列   背景线程。这个过程可以   致电cancel_join_thread()来制作   join_thread()什么都不做。

     

cancel_join_thread() :预防   阻止join_thread()。在   特别是,这可以防止   后台线程加入   进程退出时自动 -   见join_thread()

看起来你应该可以致电cancel_join_thread()来获得你想要的行为。我从来没有使用过这种方法(并且直到一分钟才知道它的存在!),所以一定要告诉我们它是否适合你。

答案 1 :(得分:3)

您可以使用p.daemon = True将进程声明为守护程序。正如http://docs.python.org/2/library/threading.html#thread-objects所说:“这个标志的意义在于,当只剩下守护程序线程时,整个Python程序都会退出。”

from multiprocessing import Process
from time import sleep

def count_sheeps(number):
    """Count all them sheeps."""
    for sheep in range(number):
        sleep(1)

if __name__ == "__main__":
    p = Process(target=count_sheeps, args=(5,))
    p.daemon = True
    p.start()
    print("Let's just forget about it and quit here and now.")
    exit()

答案 2 :(得分:1)

在Linux下你可以fork,但这不适用于Windows。我认为最简单的方法是运行一个新的Python流程,将count_sheeps放在一个单独的文件中Popen('python count_sheeps.py')

答案 3 :(得分:1)

如果您必须使它与Process一起使用,这是一个肮脏的hack。基本上,您只需要覆盖join,以便在脚本存在之前调用它 from multiprocessing import Process import time import os def info(title): print(title) print('module name:', __name__) print('parent process:', os.getppid()) print('process id:', os.getpid()) def f(name): info('function f') time.sleep(3) print('hello', name) class EverLastingProcess(Process): def join(self, *args, **kwargs): pass def __del__(self): pass if __name__ == '__main__': info('main line') p = EverLastingProcess(target=f, args=('bob',), daemon=False) p.start() 时,它只会执行阻塞操作。

obj.slow_attr()

答案 4 :(得分:0)

我尝试从 tkinter 窗口启动一个 pygame 窗口,然后关闭 tkinter 窗口,结果意外发现:

    game = Game(env)
    root.withdraw()
    game.start()
    exit()

不知道它是否有意,但它做我想要的。 (游戏源自 Process。)

答案 5 :(得分:-2)

你总是可以启动一个新线程,并在调用它的start()方法之前调用myNewThread.daemon(True)。

当主进程退出时,该线程将继续运行。