私はウェブ上で検索しましたが、同じ問題が発生している人は見つかりませんでした。Python - ImportError:[module]のローダーが__mp_main__を処理できません
私は、バックエンド用のフラスコを使用するファイルリプリケータを作成しています。レプリケータは、アップロードされたファイルを取り込み、エクスポートする前にファイル内のデータの一部をマスクします。これは、ユーザー指定の金額に対して実行されます。レプリケーションの速度を上げるために、Pythonのマルチプロセッシングライブラリを使用してプロセスを高速化し、macOSで動作させています。しかし、Windows 2008 Serverを使ってVM上で実行しようとすると、私はImportErrorを実行します。
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__
デバッグしようとすると、関数がプロセスを呼び出して開始し、エラーが発生します。次のように
# function starts processes to replicate file 'amount' times
proc_queue = Queue()
proc_lock = Lock()
proc_queue.put((file_path, file_type, 0, amount))
# ----- Create Worker Processes ----- #
try:
num_cores = cpu_count()
except NotImplementedError:
num_cores = 8
workers = [Process(target=replicate, args=(proc_queue, proc_lock)) for _ in range(num_cores)]
for p in workers:
p.daemon = True
p.start() # <--- When the ImportError is raised
# ----- Join all workers ----- #
for proc in workers:
proc.join()
複製機能が動作します:
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
が、私はWindowsとMacOSのは、子プロセスと渡す引数を処理する方法の違いについてのトピックを見つけましたが、私は子供に至るまで、すべての引数を渡していますインスタンス化のプロセス。 2つのOSの間で違うものがあるか、実装が問題を引き起こしているか、私には分かりません。
誰かが間違っている可能性のあるアイデアや考えがありますか?
私はすべてのプロセススタートアップコードを 'if __name__ == '__main __':'ブロック内に置くことにしました。もしそうなら、私は 'main'セクション内の別のファイルから作成した最初の関数呼び出しの引数をどのように渡すのでしょうか? – bkim
@bkimマルチプロセッシングの開始を処理するオブジェクトを作成することもできます。問題の原因である可能性のあるファイルをロードするときに自動的に開始されない限り、 –