【问题标题】:No module named 'Queue'没有名为“队列”的模块
【发布时间】:2017-09-22 11:37:38
【问题描述】:

我的 Python 模块导入

import Queue
from threading import Thread
import time

但是当我运行代码时

File "b1.py", line 3, in <module>
    import Queue
ModuleNotFoundError: No module named 'Queue'

我在 SO 上看到过类似的帖子,但对我没有用

/usr/bin/python3 --version
Python 3.5.2
milenko@milenko-System-Product-Name:~$ python --version
Python 3.6.0 :: Anaconda custom (64-bit)

如果我改成

from multiprocessing import Queue

没有导入问题。但是比我有这个

AttributeError: 'Queue' object has no attribute 'join'

接下来我应该尝试什么?

【问题讨论】:

  • 你可以试试import queue
  • 解释一下:在 Python 2 上,模块被命名为 Queue,在 Python 3 上,它被重命名为遵循 PEP8 指南(模块名称全部小写),使其成为 queueclass 在所有版本(遵循 PEP8)上仍为 Queue
  • @Jean-FrançoisFabre:不幸的是,那里描述的问题最好由公认的答案来回答。 requests 模块已经尝试从 queue 导入,如果失败则回退到 Queue。他们的问题根本与 Python 版本无关。使用multiprocessing.Queue 的建议是一个非常糟糕的答案(你必须给requests 打猴子补丁,这将涉及减慢一切,如果涉及到不可取的东西,则破坏);该问题的每个答案除了被接受的答案都是由不关注 OP 实际问题的人发布的。
  • @ShadowRanger 所以你建议重新开放?因为这个特定的问题更清楚,所以我会飞。您的评论(带有 PEP8 的东西)会是一个很好的答案。
  • @Jean-FrançoisFabre:我猜?这个问题是一个可怕的重复目标。大多数以它为重复的问题都是这样的,不是命名个人编写的模块queue.py 的问题(那里的最终问题),而是在 Python 3 上尝试import Queue(这里的问题)。

标签: python multithreading python-3.x python-import


【解决方案1】:

在 Python 2 上,模块名为 Queue,在 Python 3 上,was renamed 后跟 PEP8 guidelines(模块名称全部小写),使其成为 queueclass 在所有版本(遵循 PEP8)上仍为 Queue

通常,您编写版本可移植导入的方式是:

try:
    import queue           # Python 3 import
except ImportError:
    import Queue as queue  # If queue missing, we're on Py2, import Py2 as Py3 name

【讨论】:

  • 这不适用于 Python 3.6,因为它现在会抛出 ModuleNotFoundError 而不是 ImportError。更改为except ModuleNotFoundError 将再次不适用于旧版本,因为那里不存在这种异常类型。将死:D
  • @Jeronimo:工作正常。 ModuleNotFoundError is a subclass of ImportError,所以捕获 ImportError 也会捕获 ModuleNotFoundErrorImportError 没有那么细粒度(例如,它不能告诉您问题是名称隐藏模块,而不是缺少模块),但它会起作用。另外,由于我优先考虑了 Py3 名称,所以唯一会提出 ImportError 的地方是 Py2,所以它非常好。
  • 啊,好吧,你是对的。我想记得这导致我的代码最近出现错误,但我现在找不到它,所以当时肯定是其他东西......
  • 文件“main.py”,第 36 行,在 init self.queue = queue() TypeError: 'module' object is not callable
  • @John:重读我回答的第一段。模块queue(这是上面代码使用的名称,与 Python 版本无关,因为我们将 Python 2 名称别名为 Python 3 名称)包含类 Queue(在所有版本上都相同)。你想要self.queue = queue.Queue()
【解决方案2】:

在我的例子中,我有以下 Python 2.7

from Queue import Queue, Empty

我只将模块名称更改为小写,它与 Python 3 一样工作正常

from queue import Queue, Empty

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2019-03-28
    • 2017-12-30
    • 2018-01-06
    相关资源
    最近更新 更多