Python 3: 使用pip安装gi包

21

我正在尝试使用Python 3运行这个Matplotlib示例。要运行它,我需要首先安装gi(我正在使用pyenv):

$ python --version
Python 3.6.1
$ pip --version
pip 9.0.1 from /home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages (python 3.6)
$ pip install gi
Collecting gi
  Downloading gi-1.2.tar.gz
Collecting requests (from gi)
  Downloading requests-2.16.0-py2.py3-none-any.whl (85kB)
    100% |████████████████████████████████| 92kB 959kB/s 
Collecting idna<2.6,>=2.5 (from requests->gi)
  Downloading idna-2.5-py2.py3-none-any.whl (55kB)
    100% |████████████████████████████████| 61kB 1.2MB/s 
Collecting chardet<3.1.0,>=3.0.2 (from requests->gi)
  Downloading chardet-3.0.3-py2.py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 1.8MB/s 
Collecting urllib3<1.22,>=1.21.1 (from requests->gi)
  Downloading urllib3-1.21.1-py2.py3-none-any.whl (131kB)
    100% |████████████████████████████████| 133kB 1.8MB/s 
Collecting certifi>=2017.4.17 (from requests->gi)
  Downloading certifi-2017.4.17-py2.py3-none-any.whl (375kB)
    100% |████████████████████████████████| 378kB 284kB/s 
Installing collected packages: idna, chardet, urllib3, certifi, requests, gi
  Running setup.py install for gi ... done
Successfully installed certifi-2017.4.17 chardet-3.0.3 gi-1.2 idna-2.5 requests-2.16.0 urllib3-1.21.1

现在,运行这个例子:

$ python toolmanager.py 
Traceback (most recent call last):
  File "./toolmanager.py", line 8, in <module>
    import matplotlib.pyplot as plt
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/backends/backend_gtk3cairo.py", line 6, in <module>
    from . import backend_gtk3
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/backends/backend_gtk3.py", line 10, in <module>
    import gi
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/gi/__init__.py", line 39
    print url
            ^
SyntaxError: Missing parentheses in call to 'print'

看起来像是pip安装了Python 2版本?我该如何解决?

4个回答

14

首先,pip install gi会安装另一个无关的包,正确的名称是pgi。但在运行以下命令后:

$ pip uninstall gi
$ pip install pgi
$ python toolmanager.py
[...]
Traceback (most recent call last):
  File "toolmanager.py", line 14, in <module>
    import matplotlib.pyplot as plt
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/backends/backend_gtk3cairo.py", line 6, in <module>
    from . import backend_gtk3
  File "/home/hakon/.pyenv/versions/3.6.1/lib/python3.6/site-packages/matplotlib/backends/backend_gtk3.py", line 12, in <module>
    raise ImportError("Gtk3 backend requires pygobject to be installed.")
ImportError: Gtk3 backend requires pygobject to be installed.

看起来在 PyPI 上不能安装 Python 3 的 pygobject 。因此我尝试从 Ubuntu 发行包 python3-gi 安装所有内容:

$ sudo apt-get install python3-gi
$ pyenv local system
$ python3 --version
Python 3.5.3
$ python3 toolmanager.py

这样做完全没问题 :)


7
你是如何知道正确的软件包是“pgi”的? - randy
似乎不再起作用了:python3: 无法打开文件 'toolmanager.py' - jaques-sam

13

截至目前,被选中的答案 已经有些过时了:

  • pgi 的最后更新是在2018年
  • 自2018年起,PyGObject 已经可以从 PyPI 获取。

安装相关的包及其依赖项,取决于您的环境,仍然是可能的,只需按照文档中的步骤操作即可。

但是,如果您使用 venv,当导入 gi 时可能会遇到 ModuleNotFoundError: No module named 'gi' 的错误。这是因为 venv 忽略系统范围内的模块。那么,只需在您的 venv 中运行:pip install PyGObject(或使用 poetry 或您喜欢的 Python 包管理器)。当然,您仍然需要已安装 PyGObject 的依赖项(请参阅上面的文档链接)。


5
安装标准Python,Håkon Hægland的答案 是最佳选择。
但是对于备用的Python版本,可以使用pip<version>。请注意,必须使用备用pip来匹配备用python。
完整的解释在文档中给出。
例如,在openSUSE上(标准Python版本为3.6,备用版本为3.8):
> sudo zypper install cairo-devel pkg-config python3-devel gcc gobject-introspection-devel
> pip3.8 install --user pycairo
> pip3.8 install --user PyGObject
> python3.8
Python 3.8.1 (default, Feb  1 2020, 14:50:41) 
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import gi
>>> 

0
我在使用一个gradio应用时遇到了同样的问题。解决方案是...
Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.
Traceback (most recent call last):
  File "/home/pi/env/lib/python3.9/site-packages/gradio/routes.py", line 508, in predict
    output = await route_utils.call_process_api(
  File "/home/pi/env/lib/python3.9/site-packages/gradio/route_utils.py", line 218, in call_process_api
    with utils.MatplotlibBackendMananger():
  File "/home/pi/env/lib/python3.9/site-packages/gradio/utils.py", line 817, in __enter__
    self._original_backend = matplotlib.get_backend()
  File "/home/pi/env/lib/python3.9/site-packages/matplotlib/__init__.py", line 1275, in get_backend
    return rcParams['backend']
  File "/home/pi/env/lib/python3.9/site-packages/matplotlib/__init__.py", line 760, in __getitem__
    plt.switch_backend(rcsetup._auto_backend_sentinel)
  File "/home/pi/env/lib/python3.9/site-packages/matplotlib/pyplot.py", line 327, in switch_backend
    switch_backend(candidate)
  File "/home/pi/env/lib/python3.9/site-packages/matplotlib/pyplot.py", line 342, in switch_backend
    module = importlib.import_module(cbook._backend_module_name(newbackend))
  File "/usr/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 790, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/pi/env/lib/python3.9/site-packages/matplotlib/backends/backend_gtk4agg.py", line 4, in <module>
    from . import backend_agg, backend_gtk4
  File "/home/pi/env/lib/python3.9/site-packages/matplotlib/backends/backend_gtk4.py", line 12, in <module>
    import gi
  File "/home/pi/env/lib/python3.9/site-packages/gi/__init__.py", line 39
            print url
                  ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(url)?
pip卸载gi pip3安装pgi
对我来说有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接