我可能错过了一些明显的东西,但无论如何:
当你导入像这样的包时os
在 Python 中,您可以立即使用任何子模块/子包。例如这有效:
>>> import os
>>> os.path.abspath(...)
但是,我有自己的包,其结构如下:
FooPackage/
__init__.py
foo.py
在这里同样的逻辑不起作用:
>>> import FooPackage
>>> FooPackage.foo
AttributeError: 'module' object has no attribute 'foo'
我究竟做错了什么?
当您导入时FooPackage
,Python 搜索 PYTHONPATH 上的目录,直到找到名为FooPackage.py
或名为的目录FooPackage
包含一个名为__init__.py
。但是,找到包目录后,它确实not然后扫描该目录并自动导入所有 .py 文件。
这种行为有两个原因。首先,导入模块会执行 Python 代码,这可能需要时间、内存或产生副作用。所以你可能想导入a.b.c.d
不必导入所有大包a
。由包装设计者决定是否__init__.py
显式导入其模块和子包,以便它们始终可用,或者是否让客户端程序能够选择加载的内容。
第二个有点微妙,也是一个令人震惊的事情。没有明确的导入声明(在FooPackage/__init__.py
或者在客户端程序中),Python 不一定知道它应该导入什么名称foo.py
作为。在不区分大小写的文件系统(例如在 Windows 中使用)上,这可能表示名为的模块foo
, Foo
, FOO
, fOo
, foO
, FoO
, FOo
, or fOO
。所有这些都是有效的、不同的 Python 标识符,因此 Python 无法仅从文件中获得足够的信息来了解您的意思。因此,为了在所有系统上表现一致,需要在某处显式导入语句来澄清名称,即使在完整案例信息可用的文件系统上也是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)