2016-03-14 37 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。 –