繁体   English   中英

Python 使用内置模块而不是在 sys.path 中找到的自定义 package

[英]Python using built-in module instead of custom package found in sys.path

对于我支持的应用程序,我对 Python 有一个奇怪的问题。 该应用程序直到最近才正常工作,但现在它的一项服务无法启动,并出现 Python 导入错误。 没有进行任何我可以归因于此问题的更改。

该应用程序提供了自己的站点包目录,其中包含一个反向端口 package,其中包含一个 configparser package。 我不是这方面的开发人员,它是直到最近才在工作配置中的商业软件,所以我认为这更多的是系统问题而不是开发问题。

错误是:

    Traceback (most recent call last):
      File "<app_dir>/tools/vault/bin/vault-unseal.py", line 12, in <module>
        import configparser
      File "<app_dir>/python-site/lib/python2.7/site-packages/configparser.py", line 11, in <module>
        from backports.configparser import (
    ImportError: No module named configparser

我的 sys.path 是:

['',
 '/usr/lib/python2.7/site-packages/pip-19.3.1-py2.7.egg',
 '<app_dir>/python-site/lib/python2.7/site-packages',
 '<app_dir>/python-site/lib64/python2.7/site-packages',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib64/python2.7/site-packages/gtk-2.0',
 '/usr/lib/python2.7/site-packages']

这两个 package 目录都存在__init__.py

<app_dir>/python-site/lib/python2.7/site-packages/backports
<app_dir>/python-site/lib/python2.7/site-packages/backports/configparser

如果我启动 python shell 并运行“import backports”它会成功,但不是导入正确的自定义版本( <app_dir>/python-site/lib/python2.7/site-packages/backports )而是导入一个内置的。 该内置缺少 configparser package。 为什么会这样? 具有自定义 package 的正确目录列在 sys.path 的较高位置,所以它应该导入那个目录,对吧?

>>> import backports
>>> print(backports.__path__)
['/usr/lib/python2.7/site-packages/backports']
>>> backports
<module 'backports' (built-in)>

当模块位于 sys.path 中时,我指的是这个线程 Python ImportError ,它有类似的问题。 我相信列出的 3 个解决方案都不适用。 PYTHONPATH 确实包含 package 目录; 使用__init__.py正确构建包; 并且系统上只有一个版本的 python 正在使用(据我所知;如果有一种简单的方法可以验证这一点,我会这样做)。

我很茫然,任何想法都会非常感激。

所以我基本上遇到了同样的问题,虽然是我的系统 python 陷入了相当不幸的 state。 您需要弄清楚它在哪里找到backports/__init__.py并确保您已将 configparser 安装到该文件夹中。 就我而言,似乎我在/usr/lib/python2.7/site-packages/usr/lib64/python2.7/site-packages都有一个 backports 文件夹。 后者有configparser ,前者没有。 前者是它实际加载__init__.py的地方。 我通过这样做解决了这个问题

from backports import functools_lru_cache

然后打印出找到functools_lru_cache的路径。 如果您没有安装该模块(或其他一些向后移植的模块),您将不得不尝试反复试验。 您可以尝试将打印语句放入机器上所有 backport 文件夹中的所有__init__.py文件中,然后查看哪个触发。

一旦我将 configparser 安装到加载它的位置的 backports 文件夹中,我就可以正常加载所有内容。

> python
Python 2.7.18 (default, Apr 23 2020, 09:27:04) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import backports
>>> print backports
<module 'backports' (built-in)>
>>> from backports import configparser
>>> print configparser
<module 'backports.configparser' from '/usr/lib/python2.7/site-packages/backports/configparser/__init__.pyc'>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM