Как обнаружить и удалить пакеты Python, установленные через pip?
Я случайно установил пакеты Python в свою систему, используя pip
вместо apt-get
, Я сделал это двумя способами:
- используя более старую версию virtualenv, я забыл добавить
--no-site-packages
при создании virtualenv - после этого, когда я позвонилpip install
пакеты Python, установленные в системе, а не в virtualenv - в правильной настройке virtualenv я набрал
sudo pip install somepackage
- sudo установлен в систему, а не в virtualenv
Я случайно заметил это, потому что набрал pip freeze
за пределами virtualenv, и обнаружил некоторые перечисленные пакеты Python, которых там быть не должно. Итак, теперь мой вопрос:
- Как определить все пакеты Python, которые были ошибочно установлены в системе (то есть пакеты Python, которые отображаются в
pip freeze
список, но не были установлены сapt-get
)? - как мне их удалить?
6 ответов
Ubuntu Oneiric (и я ожидаю, что новые версии тоже) устанавливают пакеты pip для /usr/local/lib/python2.7/dist-packages
, а также apt
пакеты к /usr/lib/python2.7/dist-packages
, Так что просто проверьте прежний каталог и sudo pip uninstall
каждый пакет вы найдете там.
В настоящее время Pip игнорирует команды удаления, которые пытаются удалить то, что принадлежит ОС. Это не ошибка, как это происходит с отсутствующим пакетом. Итак, теперь вы можете удалить с помощью следующего процесса:
pip freeze > dump.txt
Отредактируйте выгруженный файл, чтобы удалить любой -e
строки "редактируемые установки", все после ==
знак (%s;==.*;;g
в vim), поменяйте местами новые строки для пробелов (%s;\n; ;g
в VIM). Затем вы можете удалить все ненужные пакеты с
cat dump.txt | xargs sudo pip uninstall -y
Мне пришлось сделать эту процедуру дважды, потому что несколько пакетов были установлены в ~/.local/lib
тоже.
Насколько мне известно sudo pip install
установит на /usr/local/lib/pythonVERSION/dist-packages
, Вам нужно бежать sudo pip uninstall
удалить пакеты по всей системе. Кажется, что pip freeze
ищет метаданные пакета и выводит список всего, что установлено, т.е. как из pip, так и из apt-get вне virtualenvs. Есть -l
опция в виртуальной среде, чтобы вывести список пакетов, применимых только к этой виртуальной среде, но это похоже на случай по умолчанию, а также в виртуальной среде. Я думаю, что вы можете просто удалить соответствующие пакеты на /usr/local/lib/pythonVERSION/dist-packages
но не очень удобный метод, я думаю.
Чтобы удалить пакет, установленный через pip, просто нажмите Ctrl+Alt+T на клавиатуре, чтобы открыть терминал. Когда он откроется, выполните команду ниже.
pip uninstall < package-name >
Искать пакеты
pip search <package you want to search for>
Чтобы определить, какие пакеты Python были установлены с помощью pip, freeze
Команда, которая выдаст вам список установленных пакетов и их версий. Я бы предложил удалить все экземпляры и переустановить, используя sudo apt-get
команда
sudo apt-get install python3
Я использовал следующее, чтобы удалить все пакеты pip из моей виртуальной среды:
pip list | tail -n+3 | grep -ve '^#\|^wheel\|^pip\|^setuptools ' | cut -d' ' -f1 | xargs pip uninstall -y
Я все еще держу wheel
, pip
а также setuptools
.
Также, pip list
предпочтительнее pip freeze
в моем случае с pip list
перечисляет пакеты, установленные с -e
только их именами.
Мне нужно было безопасно очистить дисковое пространство от пакетов Python. Хотя это полная очистка пакетов, мне нужно было также перенести версии Python, чтобы старые пакеты не требовались. Я использовал следующее, чтобы получить все мои имена пакетов, пропустить первые 2 строки и получить первый столбец, а также удалить без участия пользователя:
pip list | awk 'NR>2 {print $1}' | xargs -I {} pip uninstall -y {}
Это как-то связано с Homebrew. У меня не было проблем с pyodbc на моем Mac Air, пока я не установил Homebrew и не использовал его для нескольких вещей. Я нашел эту тему на github, которая заканчивается решением, которое работает для меня.
"Если у вас есть Homebrew, просто установите заголовки ODBC:
$ brew install unixodbc
и снова запустите "pip install pyodbc".
Это на 100% решило проблему для меня и заняло всего минуту. Дать ему шанс.