Python 3: установка пакета gi с помощью pip

Я пытаюсь запустить этот пример Matplotlib с использованием Python 3. Для запуска мне нужно было установить 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 ответа

Решение

Первый, 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.

Кажется, что pygobject для Python 3 не может быть установлен из PyPI. Поэтому я попытался установить все из дистрибутива Ubuntu python3-gi вместо:

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

и это отлично работает:)

Выбранный ответ на данный момент немного устарел:

  • Последнее обновление pgi в 2018 году
  • С 2018 года PyGObject доступен для python3 от PyPI.

Установка соответствующего пакета, а также его зависимостей, в зависимости от вашей среды, по-прежнему возможна, просто следуйте инструкциям из документа.

Но если вы работаете с поставщика, вы все равно можете наткнуться на ModuleNotFoundError: No module named 'gi'при импорте gi. venv игнорирует общесистемный модуль. Затем просто запустите с вашего venv: pip install PyGObject(или использовать poetryили ваш любимый менеджер пакетов Python). Конечно, вам все равно нужно установить зависимости PyGObject (см. ссылку на документ прямо вверху).

Для установки на стандартный питон лучше всего подойдет ответ Håkon Hægland.

Но для альтернативной версии Python можно использоватьpip<version>. Помните, что альтернативный пип должен использоваться для соответствия альтернативному питону.

Полные пояснения приведены в документации.

Например, в 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
>>> 

У меня была такая же проблема с приложением 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

работал у меня.

Другие вопросы по тегам