2017-08-03 2 views
0

私はウェブ上で検索しましたが、同じ問題が発生している人は見つかりませんでした。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の間で違うものがあるか、実装が問題を引き起こしているか、私には分かりません。

誰かが間違っている可能性のあるアイデアや考えがありますか?

答えて

0

これはおそらく、WindowsではPosixシステム(LinuxやOSXのようなもの)とは少し異なるものです。

hereが表示されているように、副作用を避けるために、方法をif __name__=="__main__":で保護する必要があります。

+0

私はすべてのプロセススタートアップコードを 'if __name__ == '__main __':'ブロック内に置くことにしました。もしそうなら、私は 'main'セクション内の別のファイルから作成した最初の関数呼び出しの引数をどのように渡すのでしょうか? – bkim

+0

@bkimマルチプロセッシングの開始を処理するオブジェクトを作成することもできます。問題の原因である可能性のあるファイルをロードするときに自動的に開始されない限り、 –

関連する問題