在 Multiprocessing 之前调用 Tkinter 会导致多个 windows?

Calling Tkinter before Multiprocessing causes multiple windows?

我正在尝试使用 tkinter python 将一个较大的文件处理成几个较小的文件。发生的事情是我 运行 来自批处理文件的代码,系统提示我输入文件,我 select 文件并点击确定,python 然后再打开 8 个文件对话框。如何让我的代码接受我的初始输入?据我所知,这不应该发生,因为文件对话框不在 multipro def 中。怎么回事?

代码类似于:

import tkinter, multiprocessing
from tkinter import filedialog

filename = filedialog.askopenfilename()

def multipro(num):
     code.split(filename, num)
     newfilename = filename + str(num) + fileextension
     code.save(newfilename)

def MCprocess():
    pool = multiprocessing.Pool(8)
    pool.map(multipro, num)

if __name__ == '__main__':
    num = list(range(1,10))
    MCprocess()
    sys.exit()

您需要将 filename = filedialog.askopenfilename() 放在 if __name__ == '__main__': 中,这样它就不会被每个子任务执行。

由于每个进程都在自己的内存中运行-space,因此无法在进程之间共享全局变量。如果可行,最简单的做法是将数据作为参数传递给每个进程。由于传递给 Pool.map() 的函数参数只能接受一个参数,因此我使用 functools.partial 创建了一个基于 multipro() 的临时函数来传递已经提供给它的文件名.

这里有一个更全面的答案。我已经提供了您在问题代码中遗漏的许多未定义内容(因此我可以在我的答案中测试代码)。

from functools import partial
from pathlib import Path
import sys


def multipro(filename, num):
    print(f'in multipro({filename=!r}, {num=})')
    fileextension = Path(filename).suffix

    code.split(filename, num)
    newfilename = filename + str(num) + fileextension
    code.save(newfilename)

def MCprocess(filename, nums):
    func = partial(multipro, filename)
    with multiprocessing.Pool(8) as pool:
        pool.map(func, nums)


if __name__ == '__main__':

    import tkinter, multiprocessing
    from tkinter import filedialog

    root = tkinter.Tk()
    root.withdraw()
    root.update()
    filename = filedialog.askopenfilename()
    root.destroy()

    if filename:  # User selected file?
        nums = list(range(1,10))
        MCprocess(filename, nums)