簡體   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