Python 运行进程并在不等待的情况下退出

Python 运行进程并在不等待的情况下退出,python,windows,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__":

在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上,那就太棒了。

使用
子流程
模块,因为其他子流程控制方法(os.system、os.spawn*、os.popen*、popen2.,commands.)正在被弃用:

from subprocess import Popen
Popen( [ "foo.exe", "arg1", "arg2", "arg3" )
,尤其是例子

您必须在子流程中启动一个新的Python解释器,因此上面的“foo.exe”很可能是“Python.exe”

编辑:

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

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

默认情况下,如果进程不是 队列的创建者,然后退出队列 将尝试加入队列的 背景线程。这个过程可以 调用
cancel\u join\u thread()
连接线程()
什么也不做

取消连接线程()
:防止
从阻塞中连接线程()。在里面
特别是,这可以防止
正在加入的背景线程
当流程退出时自动执行-
请参见
连接线程()


看起来您应该能够调用
cancel\u join\u thread()
来获得所需的行为。我从未使用过这种方法(直到一分钟前才意识到它的存在!),所以请务必让我们知道它是否适合您。

在Linux下,您可以使用
fork
,但这在Windows上不起作用。我认为最简单的方法是运行一个新的Python进程,将您的
count\u sheeps
放在一个单独的文件中,然后
Popen('Python count\u sheeps.py')
您可以启动一个新线程,并在调用它的start()方法之前调用myNewThread.daemon(True)


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

您可以使用
p.daemon=True
将进程声明为守护进程。正如所说:“这个标志的意义在于,当只剩下守护进程线程时,整个Python程序就会退出。”


如果您必须使用
进程
,那么这里有一个肮脏的黑客程序。基本上,您只需要覆盖
join
,以便在脚本存在之前调用它时,它不会执行任何操作,而是执行阻塞


从多处理导入进程
导入时间
导入操作系统
def信息(标题):
印刷品(标题)
打印('module name:',\uuuuu name\uuuuuuuu)
打印('父进程:',os.getppid())
打印('进程id:',os.getpid())
def f(姓名):
信息(“函数f”)
时间。睡眠(3)
打印('hello',name)
类EverLastingProcess(进程):
def连接(自身、*args、**kwargs):
通过
定义(自我):
通过
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
信息('主线')
p=EverLastingProcess(目标=f,参数=('bob',),守护进程=False)
p、 开始()

我试图从tkinter窗口启动pygame窗口,然后关闭tkinter窗口,但意外发现:

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

我不知道这是不是有意的,但它做了我想要的。(游戏源于过程。)

在这里,我通常看到相反的问题。同意-唯一的困难是将参数整理到方法中。对于count_sheeps(number)来说非常简单,其中“number”是一个整数。对于复杂参数,multiprocessing.Process方法是一种聪明的方法!是的,皮蒂·福克不在窗户上。看来我得走这条路了。谢谢,但不是真的。当主程序退出时,守护进程线程被终止。与非守护线程不同的是,程序只是杀死它们,而不是等待它们自己结束。AFAICT守护线程正是原始问题中所需要的。虽然守护进程线程没有保持运行状态,但这一回答是错误的。cancel_join_thread()似乎是用于其他目的:因此,即使进程使用的队列不是空的,该进程也可能退出。但是,除非在我的示例中有一些队列是以静默方式创建和填充的,否则我认为这不会对我有所帮助。谢谢Popen示例。我已经知道并使用subprocess.Popen对象。只是我希望这可以用多处理模块来完成。是的,但是子进程在退出时会被终止。我想OP希望它继续下去。
    game = Game(env)
    root.withdraw()
    game.start()
    exit()