cje*_*nek 11 python import packages
我对进口有疑问.这个问题似乎有点人为,但其目的是探讨在包中使用绝对导入对所有导入的限制. PEP8强烈反对相对导入(编辑:Google Python样式指南说永远不要使用它们).
假设您有两个大型包,它们都具有相同的名称,并且都根据PEP8使用绝对导入:
/pkg1
mod1.py (contains an absolute import: 'import pkg1.mod2')
mod2.py
...
/pkg1
mod1.py (contains an absolute import: 'import pkg1.mod3')
mod3.py
...
还要说你正在开发一个你想要使用这两个包的Python项目.例如,如果您想在项目中使用同一个包的两个版本,就会出现这种情况.
有没有办法将两个包合并到项目层次结构中,以便您可以在整个项目中自由使用两个包中的模块?
对于解决方案,可以使用导入别名和临时修改sys.path等操作.但是改变任一包目录的内容都是不可取的.
nco*_*lan 13
简短的回答是否定的,Python不接受两个具有相同名称的包.(有些东西称为"名称空间包",它允许在多个目录上实现单个包,但它们需要将所涉及的包设置为相互协作).
PEP 8阻止显式相对导入的方式是其更值得怀疑的建议之一,正是因为它使重命名包以避免命名冲突变得更加困难.如果这两个包使用相对导入,您可以重命名其中一个或将其嵌套在另一个包中并完成它.
进口别名不会帮助你在这里,因为它是最终的名称sys.modules的事项,以及使用的进口,而不是结束了在引入模块中所绑定的名称模块的名称.
如果你想变得异国情调,你可以编写自己的导入器(参见PEP 302和3.x importlib文档).如果你决定走那么远,你可以做任何你想做的事情.
实际上,您应该使用名称空间(包)来正确分隔您想要最终使用的模块。在你上面的代码中。
/pkg1
mod1 - can just import mod2
mod2.py
__init__.py
/pkg2
mod1 - can just import mod2
mod2.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
其余的地方你应该做import pkg1.mod1或import pkg2.mod1根据需要做。