Python 的 ImportError:没有名为存储库的模块

Python 的 ImportError:没有名为存储库的模块

我安装了三个版本的 Python:2.7、3.2 和 3.4。当我只有 2.7 和 3.2 时,一切都很好。但在从源代码手动安装 3.4 后,事情开始崩溃。3.4 没有,gi所以我通过它安装了它pip3,一切顺利。

安装 3.4 和“gi”后,2.7 的存储库丢失了(在我安装 3.4 之前它是正常工作的):

>>> import gi.repository
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named repository

所以我重新安装了python-gi,但repository仍然找不到。因此,我急于手动删除了 python 3.2 和 3.4,只需删除二进制文件并删除安装它们的默认目录即可。问题仍然存在。再次注意,在安装 3.4 之前,/usr/localpython 可以正常找到。repository

请问有什么解决办法吗?

答案1

我必须承认一件事:我喜欢摆弄 Python,因为我经常使用 Python,因此(因为我们是人类)我们的摆弄可能会破坏一些东西。

所以我遇到这个问题是因为我想在我的 Ubuntu 上安装新软件(14.04 可能与此无关)。我启动了“Ubunty 软件中心”,但什么也没发生。

经过调查这部分的起始位置,我发现它可以从命令行调用:

$ software-center
Traceback (most recent call last):
  File "/usr/bin/software-center", line 25, in <module>
    from gi.repository import Gtk, GObject
ImportError: No module named repository

哎呀。我和你的情况类似。我怎么会陷入这种破坏系统工具的境地?当然不用说,我有许多不同的 Python(2 和 3 以及其他一些)安装,那么软件中心希望运行什么?

$ more /usr/bin/software-center
#! /usr/bin/python
# Copyright (C) 2009-2011 Canonical
#
# Authors:
#  Michael Vogt
la la la...

好的/usr/bin/python。让我们看看:

$ /usr/bin/python --version
Python 2.7.12

说实话,我期望某个较低的版本,但这没问题(希望如此)。那么为什么我找不到 gi.repository?

$ /usr/bin/python
Python 2.7.12 (default, Jan  9 2017, 12:16:27) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gi.repository
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named repository
>>> import gi
>>> import gi.repository
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named repository

Gi 加载,但没有存储库。这个难题让我在 stack overflow 上回答了很多问题和答案。这里那里有很多提示,安装这个,安装那个,尝试这个和那个,包括使用 apt-get 重新安装模块甚至默认 python,然后重新安装左右这个和那个模块。但问题很顽固,无论我尝试了不同答案中的各种方法,它都坚持找不到存储库。

简而言之 -这些都没起作用

我停下来思考如何解决这个问题。过了一会儿,我想到了一个问题:

我怎么知道我实际加载的是哪个库?Python 中的导入有非常完善的文档(尽管有些肤浅)。它缺乏可以真正帮助您破解问题的更深入的文档。正在考虑通过 PYTHONPATH 修复该问题。但是...

幸运的是,我找到了以下精彩的文章。非常感谢这篇文章,因为它提供了查找问题的关键提示。请仔细阅读!

https://leemendelowitz.github.io/blog/how-does-python-find-packages.html

李,你是我的英雄!

根据 Lee 的文章中的提示,我研究了检查哪些路径:

>>> import sys
>>> print '\n'.join(sys.path)

/usr/local/lib/python2.7/dist-packages/gi-1.2-py2.7.egg
/usr/lib/python2.7/dist-packages
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
... la la la ...

嘿,/usr/local/lib/python2.7/dist-packages/gi-1.2-py2.7.egg这个列表中的 是什么?它不是应该从完全不同的 Python 安装和版本中加载库吗/usr/lib/python2.7//usr/local/lib/python2.7/!?!我肯定在某个阶段搞砸了什么。

从其他提示得知,“gi”通常不是通过 pip 安装的(而是通过apt-get install python-gi),我记得除其他事项外,我还安装了 gi 以解决这个问题(但一度失败)。阅读其他提示和想法并非没有帮助 - 它们到处都添加了小窍门,并为问题提供了一些启示。

我有一个想法:如果我简单地卸载那个“gi”,会怎么样?也许路径会恢复正常。但是我必须确保我点击的是正确的 pip(而不是来自命令行的 pip)。要确保(从 python 退出())运行 pip 模块而不是 pip 本身(pip 会做什么来找到东西?这仍然没有答案。)

$ sudo /usr/bin/python -m pip uninstall gi
Uninstalling gi:
  /usr/local/lib/python2.7/dist-packages/gi-1.2-py2.7.egg
Proceed (y/n)? y
  Successfully uninstalled gi

很好。即使 python 尝试加载 gi,它也不会在/usr/local/lib/python2.7/dist-packages/

因此:

$ /usr/bin/python
Python 2.7.12 (default, Jan  9 2017, 12:16:27) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print '\n'.join(sys.path)

/usr/lib/python2.7/dist-packages
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/home/user/.local/lib/python2.7/site-packages
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages/PILcompat
/usr/lib/python2.7/dist-packages/gst-0.10
/usr/lib/python2.7/dist-packages/gtk-2.0
/usr/lib/pymodules/python2.7
/usr/lib/python2.7/dist-packages/ubuntu-sso-client
/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode

多好啊 :)。现在就试试吧:

$ software-center

瞧!成功了!耶!!!

现在,这个故事的寓意是:

这并不总是你没有安装的东西(因为你认为它缺失了),而是你额外安装了一些东西,最好将其删除。

希望这对某人有帮助。

答案2

您需要 Python 3 版本的软件包。

sudo apt-get install python3-gi

相关内容