在清除sys.path之后,python如何进行导入 - 导入优先级

rti*_*dru 5 python ipython python-import python-2.7

我有一个名为Queue的python模块与python中的默认队列冲突.

在尝试强制导入默认队列时,我试图简单地清除sys.path.

我理解从sys.path查找导入.但是在我清除syspath之后,Python似乎仍然能够导入模块.

请解释一下!

In [26]: sys.path
Out[26]: []
In [27]: import datetime
In [28]: datetime
Out[28]: <module 'datetime' from '/usr/local/python2.7/lib/python2.7/lib-dynload/datetime.so'>
In [31]: import xyz.Queue
In [32]: xyz.Queue
Out[32]: <module 'xyz.Queue' from '/public/abc/def/ghi/xyz/Queue/__init__.pyc'>
In [33]: sys.path
Out[33]: []
Run Code Online (Sandbox Code Playgroud)

另外如何导入本机模块队列而不是Queue.

我知道重构Queue是这个问题应该得到的解决方案,但它不是现在需要的解决方案.

bac*_*ack 1

添加from __future__ import absolute_import为文件中的第一行。

这将迫使所有进口都是绝对的而不是相对的。因此import Queue将导入标准模块,以导入您要使用的本地模块from . import foobar

  • 仅当您位于包中时,显式相对导入才有效。如果用户的“Queue”包与正在运行的脚本位于同一文件夹中,那将无济于事。然而,将“Queue.py”文件移动到包中可能是一个很好的解决方案。 (3认同)
  • 这并没有回答为什么在 sys.path 为空时仍然可以加载模块的问题。答案可能是因为内部使用另一个符号来保存路径,而 sys.path 只是它的浅表副本。但是,必须检查 Python 内部结构。 (3认同)