模块未命名为'Queue'。

10

我导入Python模块的方式

import Queue
from threading import Thread
import time

但是当我运行代码时

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

我在 Stack Overflow 上看到了类似的帖子,但是对我都没有用。

/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'

我接下来应该尝试什么?


3
你可以尝试使用import queue - Jean-François Fabre
2
解释一下:在Python 2中,该模块名为“Queue”,在Python 3中,它被重命名遵循PEP8准则(所有模块名都小写),变成了“queue”。在所有版本中仍然是“Queue”(遵循PEP8)。 - ShadowRanger
1
@Jean-FrançoisFabre:不幸的是,那里描述的问题最好由被接受的答案回答。requests模块已经尝试从queue导入,然后如果失败就回退到Queue。他们的问题根本不是关于Python版本的。建议使用multiprocessing.Queue是一个真正糟糕的答案(你必须对requests进行monkey-patch,这会使一切变慢,并且如果涉及到不可pickle的东西,它会出错);除了被接受的答案之外,那个问题的每个答案都是由没有注意到OP实际问题的人发布的。 - ShadowRanger
1
@ShadowRanger,你是建议重新开启吗?因为这个特定的问题更清晰。你的评论(带有PEP8的内容)会成为一个不错的答案。 - Jean-François Fabre
1
@Jean-FrançoisFabre: 我猜?那个问题是一个很糟糕的重复目标;大多数将其作为重复项目标的问题都像这个问题一样,并不涉及将个人编写的模块命名为 queue.py(最终的问题),而是尝试在 Python 3 上导入 Queue(这里的问题)。 - ShadowRanger
@ShadowRanger,这里是一个合适的重复目标。尽管我认为你在这里的回答更好,我会将它关闭为这个问题的重复。 - Dimitris Fasarakis Hilliard
2个回答

19
在Python 2中,模块名为Queue,在Python 3中,则被重命名以遵循PEP8指南(模块名称全部小写),变成了queue。但是,在所有版本中(遵循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也无法在旧版本中使用,因为该异常类型在那里不存在。 Checkmate :D - Jeronimo
1
@Jeronimo:它运行良好。ModuleNotFoundErrorImportError的子类,因此捕获ImportError也会捕获ModuleNotFoundErrorImportError不如细粒度(例如,它无法告诉您问题是名称遮蔽模块,而不是缺少模块),但它可以工作。另外,由于我优先考虑了Py3名称,所以只有在Py2中才会引发ImportError,所以它是双重fine的。 - ShadowRanger
啊,好的,你是对的。我记得最近我的代码出了一个错误,我以为是这个原因,但现在我找不到它了,所以肯定是其他问题导致的... - Jeronimo
文件“main.py”,第36行,在__init__中: self.queue = queue() 类型错误:'module'对象不可调用。 - John
@John:请再读一遍我的回答的第一段。模块queue(无论Python版本如何,上面的代码都使用此名称,因为我们将Python 2名称别名为Python 3名称)包含类Queue(在所有版本中都相同)。您需要self.queue = queue.Queue() - ShadowRanger

0
在我的情况下,我使用的是Python 2.7,代码如下:
from Queue import Queue, Empty

我只把模块名称改成小写,它在 Python 3 中正常工作了

from queue import Queue, Empty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接