我有一个旧的系统,我试图复制。它基于一个旧的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应用程序从不同的位置加载这两个包,所以做了一些“聪明”的事情,但是我不知道是什么。任何建议都是欢迎的。
https://stackoverflow.com/questions/73898431
复制相似问题