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.py
或 somecode/__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:“导入”更喜欢啥 - 模块或包?的主要内容,如果未能解决你的问题,请参考以下文章
BeautifulSoup 和 lxml.html - 更喜欢啥? [复制]