【问题标题】:Python 2 to Python 3: can't get multiprocessing to workPython 2 到 Python 3:无法让多处理工作
【发布时间】:2016-06-28 23:35:25
【问题描述】:

我正在将我的代码从 python 2.7 移动到 python 3.5 并且无法让我的多处理代码工作,类似于以下代码。 "somemodule.py" 与主脚本在同一目录中

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'(有效)
  • IPython 控制台:'C:\WINDOWS\system32'(不起作用)

但是,Python 2 和 3 的主要(非工作)进程是 sys.path=''。为什么在 Python 3 中 sys.path[0] 的设置不同(且不一致)

【问题讨论】:

  • 你把 somemodule.py 放在哪里?
  • @Yen 对不起,我可能不够清楚,somemodule.py 与脚本位于同一目录中。我已经更新了帖子以澄清。

标签: python python-3.x anaconda python-multiprocessing


【解决方案1】:

看看你在脚本的第一行添加以下代码后得到了什么:

import sys; print(sys.path)

输出应该包括你的“somemodule”所在的目录。如果未列出,您可以在导入模块之前通过将目录附加到 sys.path 列表(小心转义反斜杠)来显式操作您的环境。

另一种选择是确保 python 解释器直接从该文件夹运行,以便“工作目录”包含 somemodule.py。

【讨论】:

  • 谢谢,这很有帮助。因此,根据文档,sys.path[0] 是当前目录(如果为空)或提供的脚本目录。我创建了另一个部分 Additional information,其中包含不同情况下工作进程的sys.path[0]。路径因不同的控制台和不同的 python 版本而异。这似乎真的不一致,这是预期的行为还是可能是一个错误?我还没有按照你的建议将工作目录添加到路径中,但我想这会起作用,尽管在这种情况下它看起来确实是一种解决方法。
  • @hobboy 我认为这些是 python 规范未涵盖的特定于实现的细节,所以解释器做自己的事情。操纵 sys.path 很常见。您可以做的另一件事是使用相对导入(.somemodule),这样机器将始终在脚本目录中查找,而不是通过 sys.path。
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多