You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多进程环境下Python程序无限重复请求文件名问题求助

问题原因
  • 在Windows系统中,multiprocessing启动子进程时会重新加载整个脚本文件。你写在顶层的name = input("Enter the file name: ")以及后续的全局变量初始化代码,会被每个子进程重复执行,所以每个子进程都会弹出输入请求,看起来像无限循环。
解决方案

把所有顶层执行的代码(除了导入和函数定义)放到if __name__ == '__main__':判断块中。这样只有主进程会执行这些代码,子进程加载脚本时不会运行这部分内容。

修改后的代码:

import multiprocessing
from PIL import Image

def decode_file(filename):
    with open(filename, mode='rb') as file:
        binary_data = file.read()

    binary_list = []
    for byte in binary_data:
        binary_list.append(format(byte, '08b'))
    return binary_list

def make_row_list(binary_list):
    row_list = []
    l = len(binary_list)
    for i in range(0, l, 135):
        row_list.append(binary_list[i:i + 135])
    return row_list

def fill_row(shared_pixels, width, row_data, count):
    x_coordinate = 0
    for byte in row_data:
        for bit in byte:
            index = x_coordinate + count * width
            shared_pixels[index] = int(bit)
            x_coordinate += 1

def fill_img(width, height, row_list):
    shared_pixels = multiprocessing.Array('i', width * height)
    processes = []
    count = 0
    for row_data in row_list:
        p = multiprocessing.Process(target=fill_row, args=(shared_pixels, width, row_data, count))
        p.start()
        processes.append(p)
        count += 1
    for process in processes:
        process.join()
    return shared_pixels

def create_img(binary_list, no_of_bytes):
    width, height = 1080, 1920
    image = Image.new('1', (width, height))

    if no_of_bytes <= 135:
        x_coordinate = 0
        for byte in binary_list:
            for bit in byte:
                image.putpixel((x_coordinate, 0), int(bit))
                x_coordinate += 1
    elif no_of_bytes <= 259200:
        row_list = make_row_list(binary_list)
        shared_pixels = fill_img(width, height, row_list)
        for y in range(height):
            for x in range(width):
                image.putpixel((x, y), shared_pixels[x + y * width])

    image.save('hi.png')
    image.show()

if __name__ == '__main__':
    name = input("Enter the file name: ")
    binary_list = decode_file(name)
    l = len(binary_list)
    no_of_bytes = l // 8
    create_img(binary_list, no_of_bytes)
额外优化说明
  • 把make_row_list改成接收binary_list参数,避免依赖全局变量,让函数更独立
  • fill_img也改为接收row_list参数,减少全局变量依赖
  • create_img接收binary_list和no_of_bytes作为参数,让逻辑更清晰,符合模块化编程习惯

内容的提问来源于stack exchange,提问作者ImBlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:43:12