在 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)
我正在尝试使用 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)