在python子进程中,线程行为很奇怪

在python子进程中,线程行为很奇怪,python,multithreading,subprocess,Python,Multithreading,Subprocess,所以我基本上有这样一个案例,在我的主要剧本中 command = 'blender -b ' + settings.BLENDER_ROOT + 'uploadedFileCheck.blend -P ' + settings.BLENDER_ROOT + 'uploadedFileCheck.py -noaudio' process = Popen(command.split(' ') ,stdout=PIPE, stderr=PIPE) out, err = process.communic

所以我基本上有这样一个案例,在我的主要剧本中

command = 'blender -b ' + settings.BLENDER_ROOT + 'uploadedFileCheck.blend -P ' + settings.BLENDER_ROOT + 'uploadedFileCheck.py -noaudio'
process = Popen(command.split(' ') ,stdout=PIPE, stderr=PIPE)
out, err = process.communicate()
在子流程脚本uploadedFileCheck.py中,我有一行

exportFile(fileIn, fileOut)
Thread(target=myfunction).start()
因此,我希望子进程在exportFile()调用后完成,或者至少返回out,err,但它似乎也在等待线程完成。有人了解这种行为吗


另外,如果您想知道,我将调用另一个python文件作为子进程,因为主脚本在python2中,而脚本(blender)在python3中,但这是不相关的(并且不能更改)

在所有非守护进程线程退出之前,进程不会退出。默认情况下,Python中的
Thread
对象被创建为非守护进程线程。如果希望脚本在主线程完成后立即退出,而不是等待生成的线程完成,请在启动前将
线程
对象上的标志设置为

t = Thread(target=myfunction)
t.daemon = True
t.start()

请注意,这将以非优雅的方式终止守护进程线程,而不会发生任何清理。如果你正在做任何需要清理的线程的工作,你应该考虑一种方法,用它来指示线程关闭它自己。至少这是我从问题中理解的…@jadkik94嗯,我认为这意味着他希望它不要等到
线程
完成…我想我们会让OP澄清并从那里开始。@dano你说得对!我不想在子进程退出之前等待线程完成。虽然这似乎是它自己的问题。在这种情况下,当子进程在线程完成之前退出时,子进程中的资源(线程可能使用的资源)会发生什么情况?@user1561753线程不能超过其内部运行的进程的生命周期。因此,当
uploadedFileCheck.py
退出时,运行
myFunction
的线程也将立即结束。是否希望在
myFunction
中发生的操作在
uploadedFileCheck.py
的生命周期之外继续运行?如果是这样的话,就不能使用线程。您必须使用
subprocess.Popen
来启动
myFunction
作为单独脚本正在执行的任何操作。谢谢!这几乎回答了我需要知道的一切