Apa cara termudah untuk menghapus semua paket yang diinstal oleh pip?

616

Saya mencoba untuk memperbaiki salah satu virtualenvs saya - Saya ingin mengatur ulang semua pustaka yang diinstal kembali ke yang sesuai dengan produksi.

Apakah ada cara cepat dan mudah untuk melakukan ini dengan pip?

blueberryfields
sumber
10
@patelshahrukh menghapus instalan python JANGAN menghapus paket pip. tolong HINDARI melakukan itu, karena kemungkinan besar TIDAK AKAN BEKERJA seperti yang Anda pikirkan, dan , tergantung pada bagaimana Anda menginstal python lagi, dapat meninggalkan mesin Anda dalam keadaan tidak stabil yang lebih banyak pekerjaan untuk diperbaiki .
blueberryfields
ini mungkin membantu untuk paket yang diinstal dalam mode pengembangan atau mode yang dapat diedit: stackoverflow.com/questions/17346619/…
Charlie Parker

Jawaban:

925

Saya telah menemukan cuplikan ini sebagai solusi alternatif. Ini adalah penghapusan perpustakaan yang lebih anggun daripada membuat ulang virtualenv:

pip freeze | xargs pip uninstall -y

Jika Anda memiliki paket yang diinstal melalui VCS, Anda harus mengecualikan baris tersebut dan menghapus paket secara manual (diangkat dari komentar di bawah):

pip freeze | grep -v "^-e" | xargs pip uninstall -y
blueberryfields
sumber
4
Saya menemukan ini solusi yang baik, semata-mata karena tidak sepenuhnya menghapus lingkungan virtual - saya mungkin telah membuat perubahan misalnya postactivateyang akan tetap ada.
niceguydave
5
Setelah menjalankan ini saya menyadari itu menghapus setuptoolspaket. Saya menyelesaikan masalah dengan mengikuti petunjuk di sini: stackoverflow.com/questions/7446187/…
Dan
1
@ gerty3000 ya, ini akan (saat pertanyaannya diajukan) menghapus semua paket yang diinstal dalam virtual-env. di lingkungan Anda, mungkin setuptools akan lebih baik dipasang di lokasi global saja?
blueberryfields
7
Anda juga dapat menggunakan pip freeze --exclude-editable | xargs pip uninstall -yuntuk mengabaikan paket VCS tanpa menggunakan pola grep
Connor Brinton
2
Dan untuk menghapus paket yang dapat diedit, lihat stackoverflow.com/questions/17346619
Dan Oak
318

Ini akan bekerja untuk semua sistem Mac, Windows, dan Linux. Untuk mendapatkan daftar semua paket pip dalam file requirement.txt (Catatan: Ini akan menimpa requirement.txt jika ada yang lain akan membuat yang baru, juga jika Anda tidak ingin mengganti persyaratan lama.txt kemudian berikan nama file yang berbeda di semua perintah berikut di tempat requirement.txt).

pip freeze > requirements.txt

Sekarang untuk menghapus satu per satu

pip uninstall -r requirements.txt

Jika kita ingin menghapus semuanya sekaligus

pip uninstall -r requirements.txt -y

Jika Anda bekerja pada proyek yang sudah ada yang memiliki requirements.txtfile dan lingkungan Anda telah menyimpang, cukup ganti requirements.txtdari contoh di atas dengan toberemoved.txt. Kemudian, setelah Anda melakukan langkah-langkah di atas, Anda dapat menggunakan requirements.txtuntuk memperbarui lingkungan Anda yang sekarang bersih.

Dan Untuk satu perintah tanpa membuat file apa pun (Seperti yang disarankan @joeb).

pip uninstall -y -r <(pip freeze)
Harshad Kavathiya
sumber
11
mungkin layak disebutkan bahwa Anda dipaksa menimpa file requirement.txt mereka, kalau-kalau mereka tidak tahu. :)
Dave Gregory
4
Selain itu, jika seseorang ingin menghapus semua paket, menambahkan "-y" akan melakukannya. Contoh:pip uninstall -r requirements.txt -y
David Metcalfe
58
Anda dapat menggunakannya pip uninstall -y -r <(pip freeze)untuk melakukan semuanya sekaligus.
joeb
1
@ Joeb ya kita bisa melakukannya juga.
Harshad Kavathiya
1
@HarshadKavathiya Anda dapat menggunakan file lain untuk menyimpan pembekuan pip, seperti "current.txt", jadi requirement.txt dapat tetap tidak tersentuh tepuk tangan
NikosKeyz
118

Ini bekerja dengan yang terbaru. Saya pikir itu cara terpendek dan paling deklaratif untuk melakukannya.

virtualenv --clear MYENV

Tapi biasanya saya hanya menghapus dan membuat ulang virtualenv karena aturan imutabilitas!

Robert Moskal
sumber
7
Apakah ini sama efektifnya dengan berlari wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
Taylor Edmiston
Sebenarnya - tampaknya (dari apa yang baru saja saya temui) sedangkan wipeenvsementara di lingkungan melempar kesalahan dan tidak menghapus apa pun jika digunakan dalam konteks pip install -epembangunan, mencoba untuk menggunakan virtualenv --clear MYENVtidak membuang kesalahan dan tidak menghapus satu pun dari paket yang mungkin telah Anda instal sebelumnya di lingkungan. Setidaknya ini yang terjadi pada OSX. Lihat bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… untuk info lebih lanjut.
mpacer
2
wipeenvadalah alias yang disediakan oleh virtualenvwrapper, jadi tidak semua orang memilikinya.
Jonathan Hartley
2
yah, ini semacam trik kotor, tetapi bekerja seperti sulap. Saya lebih suka semua orang menggunakan pip uninstall -r requirement.txt -y. Itu membuat pembersihan yang bagus.
Muema
84

Saya ingin mengangkat jawaban ini dari bagian komentar karena ini adalah salah satu solusi paling elegan di utas. Penghargaan penuh untuk jawaban ini diberikan ke @joeb .

pip uninstall -y -r <(pip freeze)

Ini berfungsi baik bagi saya untuk kasus penggunaan membersihkan folder paket pengguna saya di luar konteks virtualenv yang banyak jawaban di atas tidak menangani.

Sunting: Adakah yang tahu bagaimana membuat perintah ini berfungsi di Makefile?

Bonus: Bash alias

Saya menambahkan ini ke profil bash saya untuk kenyamanan:

alias pipuninstallall="pip uninstall -y -r <(pip freeze)"

Lalu lari:

pipuninstallall

Alternatif untuk pipenv

Jika Anda kebetulan menggunakan pipenv Anda bisa menjalankan:

pipenv uninstall --all
Taylor Edmiston
sumber
8
Harus dengan mudah menjadi # 1
Tandai
Saya suka tetapi tidak bekerja dalam kasus nol ( pip freezemenghasilkan output apa-apa jika tidak ada paket yang diinstal, dan kemudian pip uninstallmengeluh, sayangnya).
Eric G
Hmm tangkapan yang bagus. Mungkin itu bisa dibungkus dengan fungsi bash yang memeriksa apakah output pembekuan pip tidak kosong. Saya tidak melihat cara yang bagus untuk mencapai itu sambil menjaga perintah satu kalimat pendek yang bagus.
Taylor Edmiston
1
menggunakan sh secara default, tetapi sintaksis substitusi <(...)adalah bashism. Jadi Anda bisa menggunakan bash -c "...", atau bekerja dengan melakukanpip freeze | pip uninstall -r /dev/stdin
Caesar
Tidak berfungsi dengan Azure Notebook:ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
SeaDude
54

Jawaban lain yang menggunakan pip listatau pip freeze harus menyertakan yang--local lain itu juga akan menghapus paket yang ditemukan di ruang nama umum.

Jadi inilah cuplikan yang saya gunakan secara teratur

 pip freeze --local | xargs pip uninstall -y

Ref: pip freeze --help

nehem
sumber
Jawaban yang bagus ... berhasil untuk saya
igorkf
Ini bekerja sampai memukul sebuah paket yang dihasilkan kesalahan ini: ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.. Maka saya tidak bisa menghapus modul lagi.
SeaDude
39

Metode 1 (dengan pip freeze)

pip freeze | xargs pip uninstall -y

Metode 2 (dengan pip list)

pip list | awk '{print $1}' | xargs pip uninstall -y

Metode 3 (dengan virtualenv)

virtualenv --clear MYENV
Suriyaa
sumber
2
sudo tidak diperlukan, dan sangat mungkin berbahaya untuk digunakan tanpa pertimbangan yang cermat, karena ini mempengaruhi pengaturan mesin global. lihat jawaban ini misalnya: stackoverflow.com/questions/15028648/…
blueberryfields
6
Metode 2 ( pip list) berfungsi dengan baik sampai Anda memiliki pip tanpa sengaja menghapus sendiri -_-
Justin
20

Saya mengelolanya dengan melakukan hal berikut:

Buat file persyaratan yang disebut reqs.txt dengan daftar paket yang diinstal saat ini

pip freeze > reqs.txt

kemudian hapus semua paket dari reqs.txt

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

Saya suka metode ini karena Anda selalu memiliki file persyaratan pip untuk kembali jika Anda melakukan kesalahan. Itu juga bisa diulang.

Prime by Design
sumber
Sederhana dan elegan, karya seperti pesona
Satyaaditya
19

Cara tercepat adalah membuat ulang virtualenv sepenuhnya. Saya berasumsi Anda memiliki file requirement.txt yang cocok dengan produksi, jika tidak:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
Ned Batchelder
sumber
2
Apakah ini bahkan menangani kasus di mana ada instalasi yang dapat diedit (pada dasarnya setuptools mengembangkan mode instal) yang membuat file .egg-info lokal yang kemudian mengganggu proses instalasi / penghapusan instalasi lainnya? Karena ini adalah kumpulan file, sepertinya tidak tahu cara menangani keberadaan mereka, dan alih-alih menghapus instalan apa pun, itu membuat struktur direktori lokal di bawah MYENV lengkap dengan: `> Eksekusi python baru di MYENV / bin / python3.4> Juga membuat executable di MYENV / bin / python> Menginstal setuptools, pip, wheel ... done.` Tetapi MYENV belum me-reset lingkungan!
mpacer
16

Pada Windows jika Anda pathdikonfigurasi dengan benar, Anda dapat menggunakan:

pip freeze > unins && pip uninstall -y -r unins && del unins

Seharusnya kasus serupa untuk sistem seperti Unix:

pip freeze > unins && pip uninstall -y -r unins && rm unins

Hanya peringatan bahwa ini tidak sepenuhnya solid karena Anda mungkin mengalami masalah seperti 'File tidak ditemukan' tetapi tetap dapat bekerja dalam beberapa kasus

EDIT: For clarity: uninsadalah file arbitrer yang memiliki data yang ditulis padanya ketika perintah ini dijalankan:pip freeze > unins

File yang ditulisnya kemudian digunakan untuk menghapus instalasi paket-paket tersebut dengan persetujuan tersirat / persetujuan sebelumnya melalui pip uninstall -y -r unins

File akhirnya dihapus setelah selesai.

Richard Kenneth Niescior
sumber
14

Menggunakan fungsi virtualenvwrapper :

wipeenv

Lihat dokumentasi wipeenv

zesk
sumber
6
Jika Anda menggunakan virtualenvwrapper, ketikwipeenv
raratiru
@raratiru, bagus, sekarang rekan kerja saya mungkin bertanya-tanya mengapa saya hanya meludahi kopi di keyboard
Brian Joseph
@BrianJoseph Sial! Saya jatuh dari kursi ... terima kasih!
raratiru
14

Pertama, tambahkan semua paket ke requirements.txt

pip freeze > requirements.txt

Lalu hapus semua

pip uninstall -y -r requirements.txt 
shafik
sumber
9

Ini pertanyaan lama yang saya tahu tetapi saya sengaja menemukannya sehingga untuk referensi di masa mendatang Anda sekarang dapat melakukan ini:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r, --requirement file

Copot semua paket yang tercantum dalam file persyaratan yang diberikan. Opsi ini dapat digunakan beberapa kali.

dari dokumentasi pip versi 8.1

Craicerjack
sumber
8

Untuk pengguna Windows, ini yang saya gunakan di Windows PowerShell

 pip uninstall -y (pip freeze)
benwrk
sumber
6

(menambahkan ini sebagai jawaban, karena saya tidak memiliki reputasi yang cukup untuk mengomentari jawaban @blueberryfields)

@blueberryfields jawaban berfungsi dengan baik, tetapi gagal jika tidak ada paket untuk menghapus (yang bisa menjadi masalah jika ini "uninstall semua" adalah bagian dari skrip atau makefile). Ini dapat diatasi dengan xargs -rketika menggunakan versi GNU untuk xargs:

pip freeze --exclude-editable | xargs -r pip uninstall -y

dari man xargs:

-r, --no-run-if-empty

Jika input standar tidak mengandung nonblank, jangan jalankan perintah. Biasanya, perintah dijalankan sekali walaupun tidak ada input. Opsi ini adalah ekstensi GNU.

Thibaut Dubernet
sumber
6
pip3 freeze --local | xargs pip3 uninstall -y

Kasusnya mungkin bahwa seseorang harus menjalankan perintah ini beberapa kali untuk mendapatkan yang kosong pip3 freeze --local.

obotezat
sumber
3

Ini adalah cara termudah bagi saya untuk menghapus semua paket python.

from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
    system("pip3 uninstall {} -y -q".format(i.key))
Anonim 138
sumber
2

Dukungan lintas platform dengan hanya menggunakan pip:

#!/usr/bin/env python

from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions

pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
    package.project_name
    for package in
    get_installed_distributions()
    if not package.location.endswith('dist-packages')
])

options.yes = True  # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction

try:
    print pip_uninstall.run(options, args)
except OSError as e:
    if e.errno != 13:
        raise e
    print >> stderr, "You lack permissions to uninstall this package.
                      Perhaps run with sudo? Exiting."
    exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.
Samuel Marks
sumber
2

Ini adalah perintah yang bekerja untuk saya:

pip list | awk '{print $1}' | xargs pip uninstall -y
Fei Xie
sumber
2

cara mudah cross-platform yang kuat dan bekerja di pipenv juga adalah:

pip freeze 
pip uninstall -r requirement

oleh pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

tetapi tidak akan memperbarui piplock atau pipfile jadi waspadalah

Mahdi Hamzeh
sumber
1

Jika Anda menjalankan virtualenv:

virtualenv --clear </path/to/your/virtualenv>

misalnya, jika virtualenv Anda adalah /Users/you/.virtualenvs/projectx, maka Anda akan menjalankan:

virtualenv --clear /Users/you/.virtualenvs/projectx

jika Anda tidak tahu di mana virtual env Anda berada, Anda dapat menjalankan which pythondari dalam virtual env yang diaktifkan untuk mendapatkan path

punkrockpolly
sumber
1

Dalam kasus saya, saya tidak sengaja menginstal sejumlah paket secara global menggunakan Homebrew yang diinstal pippada macOS. Cara termudah untuk kembali ke paket default adalah sederhana:

$ brew reinstall python

Atau, jika Anda menggunakan pip3:

$ brew reinstall python3
Radon Rosborough
sumber
Jawaban ini mengasumsikan terlalu banyak tentang lingkungan dan tidak secara langsung menyelesaikan masalah jika Anda menggunakan pyenv misalnya.
Tandai
@ Mark Yah yakin jika Anda menggunakan pyenv, maka Anda perlu melakukan sesuatu yang berbeda. Dalam kasus umum bahwa Anda tidak, saya percaya ini adalah solusi paling sederhana dan paling tidak retas. Perhatikan bahwa kondisi ini secara eksplisit dinyatakan di awal jawaban.
Radon Rosborough
OP bertanya tentang virtualenvs. Dia tidak menyebutkan secara spesifik menggunakan Mac atau minuman untuk menginstal Python. Karena itu Anda tidak dapat mengasumsikan OS atau minuman digunakan - dan jawaban ini tidak akan menyelesaikan SEMUA kondisi. Jika Anda fokus pada pemecahan untuk lingkungan menggunakan alat seperti pip - Anda akan membahas konteks lingkungan tempat Anda berada. Harapan itu masuk akal.
Markus
1
@Mark Saya mengerti posisi Anda. Kami dapat setuju untuk tidak setuju. Saya hanya ingin membantu orang-orang dari Google yang mengeklik tautan berlabel "Apa cara termudah untuk menghapus semua paket yang dipasang oleh pip?" ketika mereka benar-benar ingin menghapus semua paket yang diinstal secara global oleh pip.
Radon Rosborough
Setuju dengan @RadonRosborough, judul tautannya mewakili mengapa saya mendarat di sini, meskipun OP sebenarnya tidak menanyakan pertanyaan yang sama.
Kenn Sebesta
1

Di Command Shell of Windows, perintah pip freeze | xargs pip uninstall -ytidak akan berfungsi. Jadi bagi Anda yang menggunakan Windows, saya telah menemukan cara alternatif untuk melakukannya.

  1. Salin semua nama paket pip yang diinstal dari pip freezeperintah ke file .txt .
  2. Lalu, buka lokasi file .txt Anda dan jalankan perintahpip uninstall -r *textfile.txt*
Sushant Chaudhary
sumber
1

Jika Anda menggunakan pew, Anda dapat menggunakan perintah wipeenv :

pew wipeenv [env]

Mohammad Banisaeid
sumber
1

Saya menggunakan opsi --user untuk menghapus semua paket yang diinstal di situs pengguna.

pembekuan pip3 --user | uninstall xargs pip3 -y

Dekan
sumber
Saya percaya jawaban ini tidak menambahkan banyak informasi baru, saya lebih suka menyarankan perbaikan untuk jawaban serupa yang sudah ada seperti ini: stackoverflow.com/a/45475070/11138259
sinoroc
-1

Pip tidak memiliki cara untuk mengetahui paket apa yang diinstal olehnya dan paket apa yang diinstal oleh manajer paket sistem Anda. Untuk ini, Anda perlu melakukan sesuatu seperti ini

untuk distro berbasis rpm (ganti python2.7 dengan versi python yang Anda instal dengan pip):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

untuk distribusi berbasis deb:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

lalu untuk membersihkan direktori kosong yang tersisa:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

Saya menemukan jawaban teratas sangat menyesatkan karena akan menghapus semua (kebanyakan?) Paket python dari distribusi Anda dan mungkin meninggalkan Anda dengan sistem yang rusak.

Glenda
sumber
Dengan segala hormat, ini tampaknya sebanding. Mengapa tidak dpkg-query -S '/usr/lib/python2.7/*', ekstrak nama, dan dpkg-query -Lsetiap nama untuk membuang file terkait? Sudah disiapkan manifes. Keberatan utama saya adalah bahwa alih-alih menargetkan paket yang diinstal di mana saja tetapi dengan pip, Anda menargetkan paket yang diinstal oleh apa pun selain manajer yang Anda harapkan, dan di lokasi yang umumnya tidak disentuh pip oleh pip. pip list -ldaftar paket yang diinstal secara lokal, dan beberapa bahkan akan pip install --target=.... Menghapus semua dir yang kosong akan menggigit Anda juga!
John P