Python-ImportError:[module]的加载程序无法处理\uuu mp\u main__

Python-ImportError:[module]的加载程序无法处理\uuu mp\u main__,python,windows,python-3.x,python-multiprocessing,Python,Windows,Python 3.x,Python Multiprocessing,我在网上搜索过,没有发现有人遇到同样的问题 我正在创建一个使用flask作为后端的文件复制器。复制器接收上传的文件,并在导出文件之前屏蔽文件中的一些数据。它以用户指定的数量执行此操作。为了加速复制,我使用python的多处理库来加速复制过程,并使其在macOS中工作。然而,当我尝试使用Windows2008Server在虚拟机上运行它时,我遇到了一个可怕的问题 Traceback (most recent call last): File "<string>", line 1, in

我在网上搜索过,没有发现有人遇到同样的问题

我正在创建一个使用flask作为后端的文件复制器。复制器接收上传的文件,并在导出文件之前屏蔽文件中的一些数据。它以用户指定的数量执行此操作。为了加速复制,我使用python的多处理库来加速复制过程,并使其在macOS中工作。然而,当我尝试使用Windows2008Server在虚拟机上运行它时,我遇到了一个可怕的问题

Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\spawn.py", line 105, in spawn_main
  exitcode = _main(fd)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\spawn.py", line 114, in _main
  prepare(preparation_data)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\spawn.py", line 223, in prepare
  _fixup_main_from_name(data['init_main_from_name'])
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\spawn.py", line 249, in _fixup_main_from_name
alter_sys=True)
File "C:\Program Files (x86)\Python36-32\lib\runpy.py", line 205, in run_module
  return _run_module_code(code, init_globals, run_name, mod_spec)
File "C:\Program Files (x86)\Python36-32\lib\runpy.py", line 96, in _run_module_code
  mod_name, mod_spec, pkg_name, script_name)
File "C:\Program Files (x86)\Python36-32\lib\runpy.py", line 85, in _run_code
  exec(code, run_globals)
File "C:\Users\esglabuser\Desktop\asib-de-identifier\server\server.py", line 22, in <module>
  app = Flask(__name__)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\flask\app.py", line 357, in __init__
  instance_path = self.auto_find_instance_path()
File "C:\Program Files (x86)\Python36-32\lib\site-packages\flask\app.py", line 662, in auto_find_instance_path
  prefix, package_path = find_package(self.import_name)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\flask\helpers.py", line 766, in find_package
  filename = loader.get_filename(root_mod_name)
File "<frozen importlib._bootstrap_external>", line 398, in _check_name_wrapper

ImportError: loader for server.server cannot handle __mp_main__
我找到了关于Windows和macOS如何处理子进程和传递参数之间差异的主题,但我将在实例化时将所有参数传递给子进程。这两个操作系统之间是否还有其他不同之处,或者是我的实现导致了问题


有人对可能出现的问题有什么想法吗?

这可能是因为在windows上,fork processus与Posix系统(如Linux或OSX)上的processus稍有不同

如您所见,您应该使用
来保护您的方法,如果uuuu name\uuuuu==“\uuuuuu main\uuuu”:
以避免副作用

主模块的安全导入

确保新Python可以安全地导入主模块 在不引起意外副作用的情况下(如启动 新工艺)

例如,使用spawn或forkserver start方法运行 以下模块将因运行时错误而失败:

from multiprocessing import Process

def foo():
    print('hello')

p = Process(target=foo)
p.start()
相反,我们应该使用 如果name='main':如下所示:

def replicate(queue, lock):
    while True:
        # ----- CRITICAL SECTION START ----- #
        with lock:
            file_path, file_type, num_times, amount = queue.get()

            if num_times >= amount:
                queue.put((file_path, file_type, num_times, amount))
                break
            else:
                num_times += 1

            queue.put((file_path, file_type, num_times, amount))
        # ----- CRITICAL SECTION END ----- #

    # Do some data transformation with file
    # Export new file
from multiprocessing import Process, freeze_support, set_start_method

def foo():
    print('hello')

if __name__ == '__main__':
    freeze_support()
    set_start_method('spawn')
    p = Process(target=foo)
    p.start()

这可能是因为在windows上,fork processus与Posix系统(如Linux或OSX)上的processus略有不同

如您所见,您应该使用
来保护您的方法,如果uuuu name\uuuuu==“\uuuuuu main\uuuu”:
以避免副作用

主模块的安全导入

确保新Python可以安全地导入主模块 在不引起意外副作用的情况下(如启动 新工艺)

例如,使用spawn或forkserver start方法运行 以下模块将因运行时错误而失败:

from multiprocessing import Process

def foo():
    print('hello')

p = Process(target=foo)
p.start()
相反,我们应该使用 如果name='main':如下所示:

def replicate(queue, lock):
    while True:
        # ----- CRITICAL SECTION START ----- #
        with lock:
            file_path, file_type, num_times, amount = queue.get()

            if num_times >= amount:
                queue.put((file_path, file_type, num_times, amount))
                break
            else:
                num_times += 1

            queue.put((file_path, file_type, num_times, amount))
        # ----- CRITICAL SECTION END ----- #

    # Do some data transformation with file
    # Export new file
from multiprocessing import Process, freeze_support, set_start_method

def foo():
    print('hello')

if __name__ == '__main__':
    freeze_support()
    set_start_method('spawn')
    p = Process(target=foo)
    p.start()

因此,我将把所有进程启动代码放在
中,而不是放在函数中?如果是这样,我将如何传递从“main”部分的另一个文件中进行的初始函数调用的参数?@bkim您还可以创建一个对象来处理多处理的开始,无论您想要什么,除非在加载文件时它没有自动启动,这可能是您的问题的原因。我会将所有进程启动代码放在
中,而不是放在函数中?如果是这样,我将如何传递从“main”部分的另一个文件中进行的初始函数调用的参数?@bkim您也可以创建一个对象来处理多重处理的开始,无论您想要什么,除非加载文件时它没有自动启动,这可能是您出现问题的原因