首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python如何从不同的位置导入不同的子包?

python如何从不同的位置导入不同的子包?
EN

Stack Overflow用户
提问于 2022-09-29 15:54:24
回答 1查看 38关注 0票数 0

我有一个旧的系统,我试图复制。它基于一个旧的Debian (7.1)系统,并使用Apache2.2.22和libasache2-mod-WSGI3.3(守护进程模式)和Python2.7.3。WSGI应用程序使用virtualenv中的包,该包是通过访问全局站点包模块创建的。它使用来自同一个命名空间包的两个子包,这些包由系统在不同的地方安装:

  • repoze.who,安装在/usr/lib/pymodules/python2.7/
  • repoze.lru,安装在/usr/lib/python2.7/dist-packages/

我的问题是它不能在复制的系统上工作:应用程序无法导入repoze.who。另一方面,在原始系统上,它工作文件并成功地导入两个子包。

我知道它不应该工作,因为在正常的配置中,Python并不期望一个包在几个地方被分割。

我读了python使用相同的根包名称和不同位置导入不同的子包。的问题及其答案。如果我按建议修改两个repoze/__init__.py文件,那么它在复制的系统上可以很好地工作。

但是我检查了原始系统上的两个文件,它们都是空的。

我在WSGI应用程序中添加了一些print指令,以研究原始系统。在这两种系统上,sys.path看起来都很好,而且很相似,在这两种系统中,/usr/lib/python2.7/dist-packages先于/usr/lib/pymodules/python2.7。令人惊讶的是,repoze包是从原始系统上的/usr/lib/pymodules/python2.7导入的,而它是从复制系统上的/usr/lib/python2.7/dist-packages导入的。此外,repoze.__path__包含原始系统上的两个位置,而它只包含复制系统上的/usr/lib/python2.7/dist-packages/repoze

最后但并非最不重要的一点是,如果我在原始系统上运行virtualenv的python解释器,它在导入repoze.who文件时无法导入repoze.lru包,这看起来像一种正常行为。因此,在mod或应用程序中必须有一些特殊的东西。

我想是为了让WSGI应用程序从不同的位置加载这两个包,所以做了一些“聪明”的事情,但是我不知道是什么。任何建议都是欢迎的。

EN

回答 1

Stack Overflow用户

发布于 2022-09-29 16:03:58

repoze正在使用命名空间包

来自setup.py

代码语言:javascript
复制
      namespace_packages=['repoze', 'repoze.who', 'repoze.who.plugins'],
  • 有关构建命名空间包的现代方法,请参见佩普420
  • 请参阅资源的旧方式(我有自己的经验,早在2000年代中期)。
  • 当您需要与已经使用该方法的现有代码兼容时,请参阅pkgutil方法。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73898431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档