Python-ImportError:[module]的加载程序无法处理\uuu mp\u main__
我在网上搜索过,没有发现有人遇到同样的问题 我正在创建一个使用flask作为后端的文件复制器。复制器接收上传的文件,并在导出文件之前屏蔽文件中的一些数据。它以用户指定的数量执行此操作。为了加速复制,我使用python的多处理库来加速复制过程,并使其在macOS中工作。然而,当我尝试使用Windows2008Server在虚拟机上运行它时,我遇到了一个可怕的问题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
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您也可以创建一个对象来处理多重处理的开始,无论您想要什么,除非加载文件时它没有自动启动,这可能是您出现问题的原因