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?
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?
Jawaban:
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
postactivate
yang akan tetap ada.
setuptools
paket. Saya menyelesaikan masalah dengan mengikuti petunjuk di sini: stackoverflow.com/questions/7446187/…
pip freeze --exclude-editable | xargs pip uninstall -y
untuk mengabaikan paket VCS tanpa menggunakan pola grep
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.txt
file dan lingkungan Anda telah menyimpang, cukup ganti requirements.txt
dari contoh di atas dengan toberemoved.txt
. Kemudian, setelah Anda melakukan langkah-langkah di atas, Anda dapat menggunakan requirements.txt
untuk 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)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
untuk melakukan semuanya sekaligus.
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!
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…
wipeenv
sementara di lingkungan melempar kesalahan dan tidak menghapus apa pun jika digunakan dalam konteks pip install -e
pembangunan, mencoba untuk menggunakan virtualenv --clear MYENV
tidak 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.
wipeenv
adalah alias yang disediakan oleh virtualenvwrapper, jadi tidak semua orang memilikinya.
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?
Saya menambahkan ini ke profil bash saya untuk kenyamanan:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Lalu lari:
pipuninstallall
Jika Anda kebetulan menggunakan pipenv Anda bisa menjalankan:
pipenv uninstall --all
pip freeze
menghasilkan output apa-apa jika tidak ada paket yang diinstal, dan kemudian pip uninstall
mengeluh, sayangnya).
<(...)
adalah bashism. Jadi Anda bisa menggunakan bash -c "...", atau bekerja dengan melakukanpip freeze | pip uninstall -r /dev/stdin
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.
Jawaban lain yang menggunakan pip list
atau 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
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.
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
pip list
) berfungsi dengan baik sampai Anda memiliki pip tanpa sengaja menghapus sendiri -_-
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.
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
Pada Windows jika Anda path
dikonfigurasi 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: unins
adalah 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.
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
(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 -r
ketika 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.
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))
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.
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
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 python
dari dalam virtual env yang diaktifkan untuk mendapatkan path
Dalam kasus saya, saya tidak sengaja menginstal sejumlah paket secara global menggunakan Homebrew yang diinstal pip
pada macOS. Cara termudah untuk kembali ke paket default adalah sederhana:
$ brew reinstall python
Atau, jika Anda menggunakan pip3
:
$ brew reinstall python3
Di Command Shell of Windows, perintah
pip freeze | xargs pip uninstall -y
tidak akan berfungsi. Jadi bagi Anda yang menggunakan Windows, saya telah menemukan cara alternatif untuk melakukannya.
pip freeze
perintah ke file .txt .pip uninstall -r *textfile.txt*
Jika Anda menggunakan pew
, Anda dapat menggunakan perintah wipeenv :
pew wipeenv [env]
Saya menggunakan opsi --user untuk menghapus semua paket yang diinstal di situs pengguna.
pembekuan pip3 --user | uninstall xargs pip3 -y
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.
dpkg-query -S '/usr/lib/python2.7/*'
, ekstrak nama, dan dpkg-query -L
setiap 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 -l
daftar paket yang diinstal secara lokal, dan beberapa bahkan akan pip install --target=...
. Menghapus semua dir yang kosong akan menggigit Anda juga!