Python 如何将外部包添加到与本地目录相同的命名空间?

Python 如何将外部包添加到与本地目录相同的命名空间?,python,python-2.7,pip,virtualenv,Python,Python 2.7,Pip,Virtualenv,初始目录结构:假定目录中的_init__u;.py文件 project/ ▾ lib/ ▸ dir/ ▸ package 我需要在其他项目中重用lib.package,因此我为它创建了一个python包并删除了该目录。但现在将其安装为lib.package我无法从项目的根目录导入它,因为它有lib目录,这会导致名称空间冲突 最终结构: ▾ project/ ▾ lib/ ▸ dir/ 以及安装在virtualenv中的名为lib.package的包 ▾

初始目录结构:假定目录中的_init__u;.py文件

project/
  ▾ lib/
     ▸ dir/
     ▸ package
我需要在其他项目中重用lib.package,因此我为它创建了一个python包并删除了该目录。但现在将其安装为lib.package我无法从项目的根目录导入它,因为它有lib目录,这会导致名称空间冲突

最终结构:

▾ project/
  ▾ lib/
     ▸ dir/
以及安装在virtualenv中的名为lib.package的包

▾ lib/
  ▸ package/
   __init__.py

我查看了一下,但是将它添加到lib.package python包的_init__u; py.py中没有任何帮助。有什么方法可以在同一命名空间库中添加本地和virtualenv安装的包吗?

在Python 2.7中,最好为依赖项选择一个唯一的名称,或者至少在应用程序的代码库中可以导入,而无需操纵路径等等,以避免此问题。我认为Python3.4中的情况有所改善,但我不能完全确定这一点


此外,我也遇到了同样的问题,决定使用唯一的名称还有另一个原因:当你想知道一个模块是从哪里来的时候,如果所有的东西都是用lib命名的,那就很难了。这意味着模块可以来自依赖项,也可以来自本地应用程序。这还意味着我可以简单地查看导入行,随时知道它是来自我自己的应用程序代码库、我自己的依赖项还是外部依赖项。

我不确定我是否理解,但听起来好像你试图将lib设置为名称空间包,而几乎将lib.package设置为名称空间包。要使用pkgutil实现这一点,必须首先扩展lib包的路径,然后扩展lib.package子包的路径。如果只执行后一种操作,则只会得到两个lib.package子包中的一个,而extendpath要么无法运行,要么没有任何可扩展的内容。这是你的问题,还是我误解了?@abarnert:我试图让dir和package都位于同一名称空间库中,即使它们位于不同的PYTHONPATH目录中。将extendpath添加到您提到的两个_init _; py中是不起作用的。您能否显示实际的代码,而不是描述它?我不确定你指的是哪两个。也有可能是您没有正确使用它,如果他们看不到您的代码,就没有人知道这一点。另外,请向我们展示你的sys.path是什么样子,以及导入lib后lib.path是什么样子。我认为你提到的3.4中的改进是自动命名空间包,这意味着你不再需要pkgutil来完成OP试图做的事情。但是名称空间包的基本概念仍然以同样的方式工作。