Можно ли использовать Python с дополнительными пакетами в Ubuntu?

Вопрос или проблема

Я хотел бы использовать Python в Ubuntu, но мне нужно использовать дополнительные пакеты, которые не установлены по умолчанию. Существует ли способ, как это можно сделать? Пока это кажется очень раздражающим, поскольку я не должен устанавливать дополнительные пакеты с помощью “глобального” pip3, но, с другой стороны, версии с “venv” не работают.

Мне нужны пакеты ‘keyring’ и ‘pycryptodome’. У меня свежая установка Ubuntu 24.04. Когда я пытаюсь:

$ pip3 install pycryptodome

Я получаю эту ошибку:

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.12/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
user:~$ 

Так что, думаю, мне не следует устанавливать пакеты “по всей системе”. Поэтому я создал .venv и установил пакет pycryptodome. Но потом я не могу использовать пакет ‘keyring’ в этом .venv:

user:~$ python3 -m venv .venv
user:~$ source .venv/bin/activate
(.venv) catchman:~$ pip3 install keyring
Collecting keyring
  Using cached keyring-25.6.0-py3-none-any.whl.metadata (20 kB)
Collecting SecretStorage>=3.2 (from keyring)
  Using cached SecretStorage-3.3.3-py3-none-any.whl.metadata (4.0 kB)
Collecting jeepney>=0.4.2 (from keyring)
  Using cached jeepney-0.8.0-py3-none-any.whl.metadata (1.3 kB)
Collecting jaraco.classes (from keyring)
  Using cached jaraco.classes-3.4.0-py3-none-any.whl.metadata (2.6 kB)
Collecting jaraco.functools (from keyring)
  Using cached jaraco.functools-4.1.0-py3-none-any.whl.metadata (2.9 kB)
Collecting jaraco.context (from keyring)
  Using cached jaraco.context-6.0.1-py3-none-any.whl.metadata (4.1 kB)
Collecting cryptography>=2.0 (from SecretStorage>=3.2->keyring)
  Using cached cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl.metadata (5.7 kB)
Collecting more-itertools (from jaraco.classes->keyring)
  Using cached more_itertools-10.6.0-py3-none-any.whl.metadata (37 kB)
Collecting cffi>=1.12 (from cryptography>=2.0->SecretStorage>=3.2->keyring)
  Using cached cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.5 kB)
Collecting pycparser (from cffi>=1.12->cryptography>=2.0->SecretStorage>=3.2->keyring)
  Using cached pycparser-2.22-py3-none-any.whl.metadata (943 bytes)
Using cached keyring-25.6.0-py3-none-any.whl (39 kB)
Using cached jeepney-0.8.0-py3-none-any.whl (48 kB)
Using cached SecretStorage-3.3.3-py3-none-any.whl (15 kB)
Using cached jaraco.classes-3.4.0-py3-none-any.whl (6.8 kB)
Using cached jaraco.context-6.0.1-py3-none-any.whl (6.8 kB)
Using cached jaraco.functools-4.1.0-py3-none-any.whl (10 kB)
Using cached cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl (4.2 MB)
Using cached more_itertools-10.6.0-py3-none-any.whl (63 kB)
Using cached cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (479 kB)
Using cached pycparser-2.22-py3-none-any.whl (117 kB)
Installing collected packages: pycparser, more-itertools, jeepney, jaraco.context, jaraco.functools, jaraco.classes, cffi, cryptography, SecretStorage, keyring
Successfully installed SecretStorage-3.3.3 cffi-1.17.1 cryptography-44.0.0 jaraco.classes-3.4.0 jaraco.context-6.0.1 jaraco.functools-4.1.0 jeepney-0.8.0 keyring-25.6.0 more-itertools-10.6.0 pycparser-2.22

(.venv) user:~$ python3
Python 3.12.3 (main, Jan 17 2025, 18:03:48) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keyring
>>> keyring.get_keyring().get_password('Chrome Keys', 'Chrome Safe Storage') == None
True

С другой стороны, ‘системный’ Python может это сделать:

user:~$ python3
Python 3.12.3 (main, Jan 17 2025, 18:03:48) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keyring
>>> len(keyring.get_keyring().get_password('Chrome Keys', 'Chrome Safe Storage'))
24

Поэтому кажется, что мне нужно использовать .venv, но в этой виртуальной среде пакет (keyring) не работает, и я должен использовать системные пакеты Python. Но когда я использую их, я не могу установить другой пакет. Какая-то безвыходная ситуация.

Поддерживает ли Ubuntu какую-то пригодную для использования среду разработки на Python? Или как я могу это исправить?

Вот моя системная информация (сообщите, если нужно что-то еще):

user:~$ cat /etc/issue
Ubuntu 24.04.1 LTS \n \l
user:~$ uname -a
Linux ryzen 6.8.0-51-generic #52-Ubuntu SMP PREEMPT_DYNAMIC Thu Dec  5 13:09:44 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

user:~$ plasmashell --version
plasmashell 5.27.11

user:~$ kf5-config --version
Qt: 5.15.13
KDE Frameworks: 5.115.0
kf5-config: 1.0

user:~$ python3 --version
Python 3.12.3

user:~$ pip3 --version
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12)

Предполагая, что под пакетом keyring вы имеете в виду python3-keyring, установленный через APT, существует известная проблема, когда системные пакеты не импортируются по умолчанию при создании venv. Это означает, что ваш venv создается только с pip и без дополнительных модулей. Самый простой способ исправить это – установить python3-keyring в системе через apt, а затем создать ваш venv с правильным включением пакетов, установленных по всей системе.

Удалите ваш venv и создайте его заново. Используйте эту команду для создания вашего venv:

python3 -m venv --system-site-packages .venv

Теперь используйте ваш venv. После этого вы должны быть в состоянии использовать модуль keyring внутри venv.

Ответ или решение

Использование Python с дополнительными пакетами в Ubuntu может показаться сложной задачей, особенно если вы сталкиваетесь с ограничениями на установку пакетов через системный pip3 в глобальной среде. Однако, на самом деле, существуют эффективные методы решения этой проблемы, которые позволят вам воспользоваться всеми возможностями Python без нарушения системных настроек Ubuntu. Рассмотрим этот процесс более подробно, следуя формуле TEA (Теория, Пример, Применение).

Теория

Ubuntu, начиная с последних версий, таких как 24.04, применяет политику управления Python, предусматривающую ограничение на установку пакетов глобально через pip3. Это сделано для защиты системы от потенциальных конфликтов и несанкционированных изменений, которые могут нарушить функционирование системных компонентов. Вместо этого пользователям предлагается использовать изолированные виртуальные среды Python (venv), в которых можно устанавливать любые пакеты, не затрагивая системную среду.

Виртуальные среды позволяют создать изолированный окружение, в котором у вас будет ваша собственная версия Python и возможность устанавливать любые пакеты без риска повлиять на работу остальной системы. Это особенно полезно для разработки, тестирования и развёртывания Python приложений.

Пример

Рассмотрим вашу проблему на примере пакетов keyring и pycryptodome. У вас возникли сложности с установкой этих пакетов и их использованием в виртуальной среде:

  1. Ошибка при установке через pip3: Попытка установить pycryptodome через глобальный pip3 приводит к ошибке из-за режима "управляемой среды", предписывающего использовать apt для установки системных пакетов или venv для изолированных.

  2. Использование venv: Вы создали venv и попытались установить ключевые пакеты, но keyring не работает должным образом в изолированной среде.

Применение

Для решения этой задачи необходимо следовать ряду шагов, которые помогут настроить вашу рабочую среду для работы с необходимыми пакетами:

  1. Создание и использование venv: Следует заново создать виртуальную среду, подключив возможность использования системных пакетов. Это обеспечит доступ к библиотекам, установленным через apt.

    python3 -m venv --system-site-packages .venv

    Этот флаг --system-site-packages позволяет виртуальной среде использовать глобально установленные системные пакеты наряду с теми, которые вы устанавливаете вручную через pip внутри venv.

  2. Активируйте свою venv:

    source .venv/bin/activate
  3. Установите необходимые пакеты в venv:

    После активации виртуальной среды вы можете установить желаемые пакеты, такие как pycryptodome, без ограничений:

    pip install pycryptodome
  4. Используйте ключевые пакеты:

    Теперь, когда вы установили все необходимые пакеты и используете виртуальную среду, интеграция с системно установленными библиотеками позволит вам их корректно применять в своих проектах.

Заключение

Хотя первоначальная настройка Python и виртуальной среды на Ubuntu 24.04 может показаться сложной, знание правильных шагов и параметров команд решает эту проблему. С помощью виртуальных сред вы получаете возможность управлять библиотеками и зависимостями на уровне проекта, не затрагивая при этом системную конфигурацию Python. Это не только минимизирует риск конфликтов, но и делает разработку более управляемой и изолированной, что особенно важно в реальных рабочих условиях.

Следуя этим рекомендациям, вы сможете эффективно использовать Python в Ubuntu для разработки приложений с любыми необходимыми дополнительными модулями.

Оцените материал
Добавить комментарий

Капча загружается...