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
работал у меня.