Python:“导入”更喜欢啥 - 模块或包?

Posted

技术标签:

【中文标题】Python:“导入”更喜欢啥 - 模块或包?【英文标题】:Python: what does "import" prefer - modules or packages?Python:“导入”更喜欢什么 - 模块或包? 【发布时间】:2011-08-28 08:01:55 【问题描述】:

假设在当前目录中有一个名为somecode.py 的文件,一个名为somecode 的目录包含一个__init__.py 文件。现在我从这个执行import somecode的目录运行一些其他Python脚本。将导入哪个文件 - somecode.pysomecode/__init__.py

是否有一个已定义且可靠的搜索顺序来解决这个问题?

哦,有没有人参考过这种行为的官方文档? :-)

【问题讨论】:

顺便说一句。这不是 ***.com/questions/4092395/… 的重复,因为该帖子的问题略有不同,并且接受的答案不能应用于我的问题。 那么,您将不得不添加到您的问题中以澄清;这两本书我都读了两遍,对我来说这完全是个骗局。那里接受的答案甚至给出了您要求的文档中的文本。 @Josh Caswell:好吧,该问题中的案例 1 确实看起来与这个完全一样,但接受的答案并没有真正说明它,或者它说错了。 (您真的必须阅读整个文档才能了解上下文;该段落出现在甚至根本没有提到包之前。)确实看起来像一个适用的答案是来自 kanaka 的答案(没有投票直到我刚刚投票赞成)。它解决了这个问题,但没有引用文档。 ***.com/q/58686448/674039 【参考方案1】:

包将在模块之前导入。图解:

% tree .
.
|-- foo
|   |-- __init__.py
|   `-- __init__.pyc
`-- foo.py

foo.py:

% cat foo.py 
print 'you have imported foo.py'

foo/__init__.py:

% cat foo/__init__.py
print 'you have imported foo/__init__.py'

来自交互式解释器:

>>> import foo
you have imported foo/__init__.py

我不知道官方记录在哪里。

根据评论进行编辑:这是在 Mac OS X 10.6.7 上使用 Python 2.7 执行的。我还在 Ubuntu 10.10 上使用 Python 2.6.5 执行了此操作,并获得了相同的结果。

【讨论】:

+1 表示尝试过,但是,这并不能证明这是一种既定的行为或运气。您可能希望使用您尝试过的确切平台来完成。 你是对的。我怀疑它与执行目录列表时默认显示文件的方式有关。 谢谢,我想这个答案对我来说已经足够好了......如果事实证明这个排序不可靠,我会在错误报告开始滚动时注意到:-) 不客气!我有兴趣在 Windows 上查看此结果,但无法访问 Windows 机器。 这记录在python.org/doc/essays/packages.html - 请参阅“如果我有同名的模块和包怎么办?”【参考方案2】:

使用以下目录在 Windows 10(Python 版本 3.5)和 Ubuntu Linux(Python 版本 2.7 和 3.5)上测试:

https://github.com/alphaCTzo7G/stackexchange/tree/master/python/order_import_module_vs_package

结果

模块总是被加载,每次都会打印出如下信息:

"你已经导入了 foo/init.py"

所以在这些系统中似乎是一致的,首先加载包。

【讨论】:

以上是关于Python:“导入”更喜欢啥 - 模块或包?的主要内容,如果未能解决你的问题,请参考以下文章

python中动态导入模块

Python导入模块问题

BeautifulSoup 和 lxml.html - 更喜欢啥? [复制]

有啥理由比 UTF-8 更喜欢 UTF-16?

你啥时候更喜欢 DateTime 而不是 DateTimeOffset

有啥理由更喜欢 System.arraycopy() 而不是 clone()?