pip не обнаруживает установленные пользователем пакеты после обновления системы python?

380
Milind R

Я использую Python на своем компьютере Fedora KDE (x64). Раньше у меня была Fedora 25, и я установил Python 3.5, используя sudo dnf install python3несколько пакетов like numpyи scipyиспользуя команды like sudo dnf install python3-numpy. Теперь не все подходящие пакеты или версии были доступны в репозиториях Fedora, поэтому я установил их только ~/.local/lib/python3.5/site-packages/через via pip3 install <packagename> --user.

Перемотка вперед, и я обновил Fedora до версии 28, во время которой python3был обновлен до версии 3.6. Все остальные python3-*пакеты также были соответствующим образом обновлены. Теперь pip3 не распознает какие-либо установленные пользователем пакеты как in pip3 list --user, и вообще ничего не выводит. Но ~/.local/lib/python3.5/site-packages/каталог все еще существует и содержит множество пакетов.

Теперь я не уверен, что я должен делать ....

  • Может быть, я могу удалить содержимое site-packages, если я точно знал, что можно удалить? Затем я могу приступить к повторному исследованию того, какие пакеты действительно нужно установить через pip.
  • Может я могу переименовать ~/.local/lib/python3.5в ~/.local/lib/python3.6?
  • Какой-нибудь другой способ заставить pip импортировать содержимое старых установленных пользователем пакетов python?

Я как бы растерялся, как поступить.

1

1 ответ на вопрос

0
hoefling

Это должно быть довольно легко сделать, если у вас все еще есть Python 3.5:

$ pip3.5 list --user --format=freeze | xargs pip3.6 install --user 

переустановит все пакеты пользовательского сайта для Python 3.6. Ситуация становится немного сложнее, когда старая установка Python исчезает (так что нет, pip3.5в вашем случае), но все равно ничего, с чем вы не можете справиться. Прежде всего, убедитесь, что пользовательский сайт все еще существует, поэтому вам есть с чем работать:

$ find ~/.local -type d -name "site-packages" | grep python3.5 /Users/hoefling/.local/lib/python3.5/site-packages 

Теперь используйте pkg_resourcesдля перечисления дистрибутивов, доступных на этом сайте пользователя:

$ find ~/.local -type d -name "site-packages" | grep python3.5 | xargs python3.6 -c "import pkg_resources, sys; print(' '.join((f'==' for pkg in pkg_resources.find_distributions(sys.argv[1]))))" wheel==0.30.0 

Пользовательский каталог сайта будет передан в строку кода Python, которая будет сканировать каталог с помощью pkg_resources.find_distributionsфункции (см. Раздел « Получение или создание дистрибутивов » в документах), которая является той же самой, которая pipиспользуется под капотом, IIRC. Я только добавил некоторое форматирование, чтобы вы могли затем передать вывод новому pip3.6в последней итерации расширения одной строки. Полный однострочный:

$ find ~/.local -type d -name "site-packages" | grep python3.5 | xargs python3.6 -c "import pkg_resources, sys; print(' '.join((f'==' for pkg in pkg_resources.find_distributions(sys.argv[1]))))" | xargs pip3.6 install --user 

pkg_resourcesявляется частью setuptoolsпакета и должен быть предварительно установлен (по крайней мере, так происходит при использовании установщиков с https://www.python.org/downloads/ ). Если нет, setuptoolsсначала установите :

$ dnf install python3-setuptools 

Похожие вопросы