我有以下结构:
/blog
/app
/static
staticfile.py
/templates
templatefile.py
run.py
我有run.py
,
from app.static import staticfile
print("you run me")
我staticfile.py
print("ran from staticfile")
当我跑python run.py
时,我明白了,
ran from staticfile
you run me
我没有__init__.py
任何地方,我没有虚拟环境。如果没有__init__.py
文件,我的参考如何工作?是因为我使用的是Python 3.4吗?如果重要的话,我在Windows 7中。
C:\python27\python run.py
,但在我放__init__.py
之前它失败了。
答案 0 :(得分:2)
3.4词汇表有此条目
命名空间包
PEP 420包装,仅用作子包装的容器。 命名空间包可能没有物理表示,并且 特别是不像普通包装,因为他们没有 init .py文件。
从我对PEP的阅读中,sys.path
但不包含__init__.py
的目录中包含的目录是潜在的命名空间目录。运行run.py
后,代表'.'
的{{1}}会添加到/blog
的前面。因此,`/ blog'中的目录被搜索为潜在的命名空间目录。
PEP也说
如果开发人员知道她的包裹永远不会成为其中的一部分 命名空间包,然后它有一个性能优势 常规包(使用 init .py)。创建和加载常规 包装可以沿路径定位时立即进行。 使用命名空间包时,必须扫描路径中的所有条目 在创建包之前。
换句话说,sys.path
上的每个目录都可能会搜索sys.path
包中的其他模块,而不是停留在app.static
('.'
)。我会继续添加您认为必需的/blog
个文件。
PEP也注意到了可能的意外效果。
请注意,将不再为目录引发ImportWarning 缺少 init .py文件。这样的目录现在将导入为 命名空间包,而在以前的Python版本中是ImportWarning 会被提出来。
答案 1 :(得分:0)
是的,从Python 3.3开始,您不需要在包中加入__init__.py
。有关详细信息,请参阅PEP 420。