Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Почему в PyCharm под ALT Linux в «чистое» виртуальное окружение «просачиваются» лишние пакеты?

Первый раз сталкиваюсь с таким. До того ни под Windows, ни под MacOs такого не встречалось. Похоже какой-то странный артефакт состыковки PyCharm и Alt Linux (в других Linux эффект не наблюдается). Рассказываю:

Если создавать виртуальное окружение (не важно какими средствами, через сам PyCharm,, или средствами virtualenv), то в терминале PyCharm, через pip показывает, что в «чистое окружение» уже установлено просто прорва пакетов. Тоже самое показывает и средствами самого PyCharm (через Settings --> Python Interpreter). Например:
pip freeze
Показывает:
attrs==22.1.0
build==0.10.0
CacheControl==0.12.11
certifi==2022.9.24
cffi==1.15.1
charset-normalizer==2.1.1
cleo==2.0.1
crashtest==0.4.1
cryptography==37.0.4
Cython @ file:///buildstream-build
distlib==0.3.6
dulwich==0.21.3
filelock==3.12.0
html5lib==1.1
idna==3.4
installer==0.7.0
jaraco.classes==3.2.3
jeepney==0.8.0
jsonschema==4.16.0
keyring==23.9.3
lockfile==0.12.2
Mako @ file:///buildstream-build
Markdown @ file:///buildstream-build
MarkupSafe @ file:///buildstream-build
meson==0.63.3
more-itertools==8.14.0
msgpack==1.0.4
packaging==22.0
pexpect==4.8.0
pipenv==2023.4.29
pkginfo==1.9.6
platformdirs==2.5.2
poetry==1.4.2
poetry-core==1.5.2
poetry-plugin-export==1.3.1
ptyprocess==0.7.0
pycparser==2.21
Pygments @ file:///buildstream-build
pyproject_hooks==1.0.0
pyrsistent==0.18.1
rapidfuzz==2.13.7
requests==2.28.1
requests-toolbelt==0.9.1
SecretStorage==3.3.3
shellingham==1.5.0
six @ file:///buildstream-build
tomli==2.0.1
tomlkit==0.11.5
trove-classifiers==2022.12.22
urllib3==1.26.12
virtualenv==20.16.5
virtualenv-clone==0.5.7
webencodings==0.5.1


если активировать такое виртуальное окружение из терминала системы (не из терминала PyCharm) то никаких таких пакетов не показывает. Окружение чистое.

Ситуация повторяется, и совершенно не важно каким методом создается виртуальное окружение: virtualenv, pipenv или poetry. Через python3 -m venv -- пакеты все равно «просачиваются». И эти же пакеты будут видны внутри PyCharm даже если создавать виртуальное окружение из терминала системы.

Собственно, назвать это «просачиванием» не так чтоб корректно. Все эти «батарейки» действительно лежат в папочке виртуального окружения (в моем случае: .../env/lib/python3.10/site-packages/pip). Но почему они видны через PyCharm и не видны через терминал системы (после активации виртуального окружения)?

Наверное можно жить и так, но уж больно велико число «просочившихся» пакетов. Среди них теряются пакеты установленные самостоятельно.

Поведение одинаково и для Python (версии 3.9.16) который был в системе, так и для собранного из исходников (3.10.12).

P.S. «Просочившихся» через PyCharm удалить нельзя... Сообщается, что "пакет удален", но в списках он остается... папка с пакетом внутри .../env/lib/python3.10/site-packages/pip тоже остается. Обновлять «просочившихся» пакеты тоже не получается.

P.P.S. По опыту Windows и MacOS в работе с пакетами через PyCharm и из командной строки тоже были отличия. В частности через PyCharm видны сами пакетные менеджеры pip, setuptools и wheel. Их же через PyCharm можно и обновлять. При работе с виртуальном окружении из командной строки пакетные менеджеры не отображаются (это внешние для самих пакетных менеджеров сущности), что, собственно, логично. Но пакетные менеджеры не отображались и в терминале самого PyCharm (только через Settings --> Python Interpreter). Под Alt Linux, похоже терминал внутри PyCharm, совсем не то, что терминал системы.

Как «погасить» «просочившихся» пакеты в терминале PyCharm или по другому как вылечить проблему?
  • Вопрос задан
  • 279 просмотров
Решения вопроса 1
Sergei_Erjemin
@Sergei_Erjemin Автор вопроса
Улыбайся, будь самураем...
В Alt Linux установку PyCharm (и других приложений JetBrains) можно осуществить несколькими способами. И первый из них -- установка через Flatpak. При его использовании установка и исполнение приложения происходит в некоей "изолированной среде". Таким образом, любое виртаульное кружение, созданное в PyCharm, создаётся внутри в "изолированной среды" Flatpak... При подключении существующего виртуального окружения, "изолированный" PyCharm не имеет возможности взаимодейтвовать с ним напрямую, и просто копирует его (виртуальное окружение) внутрь "изоляции" Flatpak. Виртальное окружение внутри Flatpak как раз и соодежит все эти "просочившиеся пакеты". Поэтому во "внешней среде" (системной) этих пакетов и не видно. Предположительно, это эти пакеты нужны самомому Flatpack и именно поэтому их нельзя ни удалить, ни обновить (зато можно поставить второй пакет радом, и таким образом может существовать одновременно urllib3 разных версий, lol).

Кроме того, в изолированной среде Flatpak фиксируется внешнее состояние системных пакетоов на момент его развертывания (в данном случае -- на момент установки PyCharm). Все последующие изменения системных пакетов в изолированную среду Flatpack не попадают. И получается следующее: если, например, мы установим в Alt Linux новую версию Python, то при создании (или подключении) виртального окружения c этой версией Python средствами PyCharm, благодаря механизму virtualenv, этот новый Python будет перенесён внутрь "изоляции" Flatpack. Но если, мы доустановим в Alt Linux системные пакеты (например: mariadb-client или libmariadb3), то в изолированную среду Flatpack они уже не попадут(!). Что, например у меня, вызвало шок: в терминале Alt Linux установка pip install mysqlclient проходит, а в терминале PyCharm падает.

Как лечить?

В Alt Linux есть второй способ устаноки PyCharm -- c момощью пакетного менеджера snap:
snap install --classic pycharm-professional
Среда snap менее изолированна. Она видит (и использует) текущее состояние системных пакетов Alt Linux и ей не нужны никакие внутренние python-пакеты. Таким образом PyCharm не показывает никаких "просочившихся" батареек (их нет, т.к. среда не изолированна).

Правда возникает другой побочный эффект -- средствами PyCharm не получается с нуля создать "чистое" виртаульное окружение. Можно только подключить существующее. Как устанавливать пакеты в это окружение -- не важно. Можно через pip (в терминале Alt Linux или PyCharm), а можно через графический интерфейс "Settings --> Project Interpeter".

----

Очевидно, что самай лучший способ установки -- с помощью pycharm.sh из дистрибутива JetBrains. Но, такая установки потребует разобраться с JDK внутри Alt Linux и сделать правильные настройки переменных $pycharm_jdk, $jdk_home/$java_home. Для разных версий PyCharm они могут отличаться, так что использование snap под Alt Linux, мне кажется, -- наиболее простой путь.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы