2016-03-14 38 views
0

我將我的代碼從Python 2.7移動到python 3.5,無法讓我的多重處理代碼工作,如下面的代碼。 「somemodule.py」與主腳本位於同一目錄中。Python 2到Python 3:無法讓多重處理工作

import multiprocessing as mp 

# somemodule is in the same folder as this script 
import somemodule 

def foo(bar): 
    print(bar) 
    return 

if __name__ == '__main__': 
    bar = ("alice","bob") 
    pool = mp.Pool(processes=2) 
    pool.map(foo, bar) 
    pool.close() 

回溯是

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 106, in spawn_main 
    exitcode = _main(fd) 
    File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 115, in _main 
    prepare(preparation_data) 
    File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 226, in prepare 
    _fixup_main_from_path(data['init_main_from_path']) 
    File "C:\Anaconda3\lib\multiprocessing\spawn.py", line 278, in _fixup_main_from_path 
    run_name="__mp_main__") 
    File "C:\Anaconda3\lib\runpy.py", line 240, in run_path 
    pkg_name=pkg_name, script_name=fname) 
    File "C:\Anaconda3\lib\runpy.py", line 96, in _run_module_code 
    mod_name, mod_spec, pkg_name, script_name) 
    File "C:\Anaconda3\lib\runpy.py", line 85, in _run_code 
    exec(code, run_globals) 
    File "C:\Users\hobboy\Documents\project\pool_test3.py", line 2, in <module> 
    import somemodule 
ImportError: No module named 'somemodule' 

代碼工作中的Spyder的Python的控制檯,但不IPython中(與Anaconda3 2.5.0工作)。 工作進程無法導入somemodule,但主進程可以爲。這是否與import somemodule不適當或其他?我已經閱讀了一些Python 3的導入語法,但我仍然不確定。

我在Anaconda社區論壇上發了一篇文章,但更多的是關於Anaconda而不是代碼本身的問題。


其他信息:

主進程(非職工)爲Python 2.7/3.5,sys.path[0]=''不管控制檯/ Python版本

有趣的是,sys.path中[ 0]因工作進程而異:

Spyder 2.3.8(Python 2.7)

  • Python的控制檯:'(作品)
  • IPython的控制檯:'(作品)

Spyder的2.3.8(Python的3.5)

  • Python的控制檯: 'C:\ Users \ hobboy \ Documents \ project'(works)
  • IPython控制檯:'C:\ WINDOWS \ system32'(不起作用)

但是Python 2和Python 3的主要(非工作者)進程是sys.path=''。爲什麼是的sys.path [0]被設置不同(不一致)在Python 3

+0

你把somemodule.py放在哪裏? – Yen

+0

@Yen對不起,我可能不夠清楚,somemodule.py與腳本位於同一目錄中。我已更新該帖子以澄清。 – hobboy

回答

3

看,當你在你的腳本的第一行添加以下代碼你會得到什麼:

import sys; print(sys.path) 

輸出應該包含你的「somemodule」所在的目錄。如果未列出,可以通過在導入模塊之前將目錄附加到sys.path列表(仔細轉義反斜槓)來顯式操縱您的環境。

另一種方法是確保python解釋器直接從該文件夾運行,以便「工作目錄」包含somemodule.py。

+0

謝謝,這很有幫助。 所以根據文檔'sys.path [0]'是當前目錄如果是空的,或提供的腳本目錄。我創建了另一部分**其他信息**在不同情況下具有工作進程的sys.path [0]。 路徑因不同的控制檯和不同的python版本而異。這看起來確實不一致,這是預期的行爲還是它可能是一個錯誤?我還沒有將工作目錄添加到路徑中,但我想這可能會起作用,儘管在這種情況下它看起來像是一種解決方法。 – hobboy

+0

@hobboy我認爲這些是python規範沒有涉及的特定於實現的細節,因此解釋器會自己做。操縱sys.path非常普遍。你可以做的另一件事是使用相對導入(.somemodule),以便機器總是查看腳本目錄而不是通過sys.path。 –