ฉันกำลังพยายามแก้ไข virtualenv ตัวใดตัวหนึ่งของฉัน - ฉันต้องการรีเซ็ตไลบรารีที่ติดตั้งทั้งหมดกลับไปเป็นแบบที่ตรงกับการผลิต
มีวิธีที่ง่ายและรวดเร็วในการทำเช่นนี้กับ pip หรือไม่?
ฉันกำลังพยายามแก้ไข virtualenv ตัวใดตัวหนึ่งของฉัน - ฉันต้องการรีเซ็ตไลบรารีที่ติดตั้งทั้งหมดกลับไปเป็นแบบที่ตรงกับการผลิต
มีวิธีที่ง่ายและรวดเร็วในการทำเช่นนี้กับ pip หรือไม่?
คำตอบ:
ฉันพบข้อมูลโค้ดนี้เป็นโซลูชันทางเลือก เป็นการลบไลบรารีที่สง่างามกว่าการสร้าง virtualenv ใหม่:
pip freeze | xargs pip uninstall -y
ในกรณีที่คุณมีแพ็คเกจที่ติดตั้งผ่าน VCS คุณจะต้องยกเว้นบรรทัดเหล่านั้นและลบแพ็คเกจด้วยตนเอง (ยกระดับจากความคิดเห็นด้านล่าง):
pip freeze | grep -v "^-e" | xargs pip uninstall -y
postactivate
ซึ่งจะยังคงอยู่
setuptools
แพ็คเกจ ฉันแก้ไขปัญหาตามคำแนะนำที่นี่: stackoverflow.com/questions/7446187/…
pip freeze --exclude-editable | xargs pip uninstall -y
เพื่อละเว้นแพ็คเกจ VCS โดยไม่ใช้รูปแบบ grep
สิ่งนี้จะใช้ได้กับระบบ Mac, Windows และ Linux ทั้งหมด ในการรับรายการของแพคเกจ pip ทั้งหมดในไฟล์ requirements.txt (หมายเหตุ: นี่จะเขียนทับข้อกำหนด.txtหากมีอยู่แล้วจะสร้างแพ็คเกจใหม่อีกทั้งถ้าคุณไม่ต้องการแทนที่ข้อกำหนดเก่า.txtให้ตั้งชื่อไฟล์ที่แตกต่างกัน ในคำสั่งต่อไปนี้ทั้งหมดในสถานที่ requirements.txt)
pip freeze > requirements.txt
ตอนนี้เพื่อลบหนึ่งโดยหนึ่ง
pip uninstall -r requirements.txt
ถ้าเราต้องการลบทั้งหมดในครั้งเดียวแล้ว
pip uninstall -r requirements.txt -y
หากคุณกำลังทำงานในโครงการที่มีอยู่ที่มีrequirements.txt
ไฟล์และสภาพแวดล้อมของคุณได้แยกออกมาเพียงแค่เปลี่ยนจากตัวอย่างข้างต้นด้วยrequirements.txt
toberemoved.txt
จากนั้นเมื่อคุณทำตามขั้นตอนข้างต้นแล้วคุณสามารถใช้requirements.txt
เพื่ออัปเดตสภาพแวดล้อมปัจจุบันของคุณได้
และสำหรับคำสั่งเดียวโดยไม่ต้องสร้างไฟล์ใด ๆ (ตามที่ @joeb แนะนำ)
pip uninstall -y -r <(pip freeze)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
ทำทุกอย่างได้ในครั้งเดียว
ใช้งานได้กับล่าสุด ฉันคิดว่ามันเป็นวิธีที่สั้นและชัดเจนที่สุดที่จะทำ
virtualenv --clear MYENV
แต่โดยปกติฉันจะลบและสร้าง virtualenv ใหม่ตั้งแต่กฎที่ไม่สามารถเปลี่ยนแปลงได้!
wipeenv
หรือไม่ virtualenvwrapper.readthedocs.org/en/latest/…
wipeenv
ที่ในสภาพแวดล้อมมีข้อผิดพลาดและไม่ลบอะไรเลยหากใช้ในบริบทของpip install -e
การสร้างการพัฒนาความพยายามที่จะใช้virtualenv --clear MYENV
ไม่ทำให้เกิดข้อผิดพลาด แพ็คเกจที่คุณอาจติดตั้งไว้ก่อนหน้านี้ในสภาพแวดล้อม อย่างน้อยก็เป็นอย่างนี้ใน OSX ดูbitbucket.org/dhellmann/virtualenvwrapper/issues/211/…สำหรับข้อมูลเพิ่มเติม
wipeenv
เป็นนามแฝงที่จัดทำโดย virtualenvwrapper ดังนั้นจึงไม่ใช่ทุกคนที่มี
ฉันต้องการยกระดับคำตอบนี้ออกจากส่วนความคิดเห็นเพราะมันเป็นหนึ่งในโซลูชั่นที่หรูหราที่สุดในหัวข้อ เครดิตเต็มสำหรับคำตอบนี้ไป@joeb
pip uninstall -y -r <(pip freeze)
สิ่งนี้ใช้งานได้ดีสำหรับฉันสำหรับกรณีที่ใช้ในการล้างโฟลเดอร์แพ็คเกจผู้ใช้ของฉันนอกบริบทของ virtualenv ซึ่งคำตอบข้างต้นหลายข้อไม่ได้จัดการ
แก้ไข: ใครรู้วิธีทำให้คำสั่งนี้ทำงานใน Makefile หรือไม่
ฉันเพิ่มสิ่งนี้ลงในโปรไฟล์ทุบตีของฉันเพื่อความสะดวก:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
จากนั้นเรียกใช้:
pipuninstallall
หากคุณกำลังใช้pipenvคุณสามารถเรียกใช้:
pipenv uninstall --all
pip freeze
ไม่มีผลลัพธ์ใด ๆ หากไม่มีการติดตั้งแพ็กเกจแล้วก็pip uninstall
บ่นได้อย่างน่าเสียดาย)
<(...)
เป็น bashism ดังนั้นคุณสามารถใช้ bash -c "... " หรือหลีกเลี่ยงโดยการทำpip 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.
คำตอบอื่น ๆ ที่ใช้pip list
หรือpip freeze
ต้องรวมอยู่ใน--local
นั้นจะถอนการติดตั้งแพ็คเกจที่พบในเนมสเปซทั่วไป
ดังนั้นนี่คือตัวอย่างที่ฉันใช้เป็นประจำ
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.
นี้ทำงานจนกว่าจะตีแพคเกจที่ผลิตข้อผิดพลาดนี้: จากนั้นฉันไม่สามารถถอนการติดตั้งโมดูลได้อีก
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
) ใช้งานได้ดีจนกว่าคุณจะถอนการติดตั้ง pip โดยไม่ตั้งใจตัวเอง -_-
ฉันจัดการโดยทำสิ่งต่อไปนี้:
สร้างไฟล์ข้อกำหนดที่เรียกว่าreqs.txtด้วยรายการแพคเกจที่ติดตั้งในปัจจุบัน
pip freeze > reqs.txt
จากนั้นถอนการติดตั้งแพ็กเกจทั้งหมดจากreqs.txt
pip uninstall \
-y # remove the package with prompting for confirmation
-r reqs.txt
ฉันชอบวิธีนี้เนื่องจากคุณมีไฟล์ข้อกำหนด pip อยู่เสมอหากคุณทำผิดพลาด นอกจากนี้ยังทำซ้ำได้
วิธีที่เร็วที่สุดคือการสร้าง virtualenv ใหม่ทั้งหมด ฉันสมมติว่าคุณมีไฟล์ requirements.txt ที่ตรงกับการใช้งานจริงหากไม่ใช่:
# On production:
pip freeze > reqs.txt
# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
บน Windows หากpath
กำหนดค่าไว้ถูกต้องคุณสามารถใช้:
pip freeze > unins && pip uninstall -y -r unins && del unins
มันควรจะเป็นกรณีที่คล้ายกันสำหรับระบบที่คล้าย Unix:
pip freeze > unins && pip uninstall -y -r unins && rm unins
เพียงแค่เตือนว่าสิ่งนี้ไม่สมบูรณ์อย่างสมบูรณ์เนื่องจากคุณอาจพบปัญหาเช่น 'ไม่พบไฟล์' แต่อาจทำงานได้ในบางกรณีอย่างไรก็ตาม
แก้ไข: เพื่อความชัดเจน: unins
เป็นไฟล์โดยพลการซึ่งมีข้อมูลเขียนออกมาเมื่อคำสั่งนี้ดำเนินการ:pip freeze > unins
ไฟล์นั้นที่ถูกเขียนทับจะถูกใช้เพื่อถอนการติดตั้งแพ็กเกจดังกล่าวข้างต้นโดยได้รับความยินยอมโดยนัย / การอนุมัติล่วงหน้าผ่านทาง pip uninstall -y -r unins
ในที่สุดไฟล์จะถูกลบเมื่อเสร็จสิ้น
ก่อนอื่นให้เพิ่มแพ็คเกจทั้งหมดลงใน requirements.txt
pip freeze > requirements.txt
จากนั้นลบทั้งหมด
pip uninstall -y -r requirements.txt
มันเป็นคำถามเก่า ๆ ที่ฉันรู้ แต่ฉันสะดุดไปแล้วดังนั้นสำหรับการอ้างอิงในอนาคตคุณสามารถทำได้:
pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...
-r, - ข้อกำหนดของไฟล์
ถอนการติดตั้งแพ็กเกจทั้งหมดที่ระบุไว้ในไฟล์ข้อกำหนดที่กำหนด ตัวเลือกนี้สามารถใช้ได้หลายครั้ง
สำหรับผู้ใช้ Windows นี่คือสิ่งที่ฉันใช้บนWindows PowerShell
pip uninstall -y (pip freeze)
(เพิ่มคำตอบนี้เพราะฉันไม่มีชื่อเสียงเพียงพอที่จะแสดงความคิดเห็นในคำตอบของ @blueberryfields)
คำตอบของ @blueberryfields ทำงานได้ดี แต่ล้มเหลวหากไม่มีแพ็คเกจที่จะถอนการติดตั้ง (ซึ่งอาจเป็นปัญหาหาก "ถอนการติดตั้งทั้งหมด" นี้เป็นส่วนหนึ่งของสคริปต์หรือ makefile) สิ่งนี้สามารถแก้ไขได้xargs -r
เมื่อใช้เวอร์ชั่นของ GNU xargs
:
pip freeze --exclude-editable | xargs -r pip uninstall -y
จากman xargs
:
-r, - no-run-if-empty
หากอินพุตมาตรฐานไม่มีช่องว่างใด ๆ ห้ามรันคำสั่ง โดยปกติคำสั่งจะรันหนึ่งครั้งแม้ว่าจะไม่มีอินพุต ตัวเลือกนี้เป็นส่วนขยายของ GNU
pip3 freeze --local | xargs pip3 uninstall -y
pip3 freeze --local
กรณีที่อาจจะมีที่หนึ่งที่มีการเรียกใช้คำสั่งนี้หลายครั้งที่จะได้รับที่ว่างเปล่า
นี่เป็นวิธีที่ง่ายที่สุดในการถอนการติดตั้งแพ็กเกจหลามทั้งหมด
from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
system("pip3 uninstall {} -y -q".format(i.key))
การสนับสนุนข้ามแพลตฟอร์มโดยใช้เท่านั้น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.
นี่คือคำสั่งที่ใช้งานได้สำหรับฉัน:
pip list | awk '{print $1}' | xargs pip uninstall -y
วิธีที่ง่ายต่อการใช้งานข้ามแพลตฟอร์มและทำงานใน pipenv ได้เป็นอย่างดีคือ:
pip freeze
pip uninstall -r requirement
โดย pipenv:
pipenv run pip freeze
pipenv run pip uninstall -r requirement
แต่จะไม่อัปเดต piplock หรือ pipfile ดังนั้นโปรดระวัง
หากคุณกำลังทำงานvirtualenv
:
virtualenv --clear </path/to/your/virtualenv>
ตัวอย่างเช่นหาก virtualenv ของคุณเป็น/Users/you/.virtualenvs/projectx
เช่นนั้นคุณจะทำงาน:
virtualenv --clear /Users/you/.virtualenvs/projectx
หากคุณไม่ทราบว่าที่ตั้งของ env เสมือนจริงคุณสามารถเรียกใช้which python
จากภายใน env เสมือนที่เปิดใช้งานเพื่อรับเส้นทาง
ในกรณีของฉันฉันได้ติดตั้งแพคเกจจำนวนหนึ่งทั่วโลกโดยไม่ตั้งใจโดยใช้ Homebrew ติดตั้งpip
บน macOS วิธีที่ง่ายที่สุดในการย้อนกลับไปใช้แพ็คเกจเริ่มต้นนั้นง่ายมาก:
$ brew reinstall python
หรือถ้าคุณใช้pip3
:
$ brew reinstall python3
ในCommand Shellของ Windows คำสั่ง
pip freeze | xargs pip uninstall -y
จะไม่ทำงาน ดังนั้นสำหรับพวกคุณที่ใช้ Windows ฉันได้ค้นพบวิธีอื่นในการทำเช่นนั้น
pip freeze
คำสั่งไปยังไฟล์. txtpip uninstall -r *textfile.txt*
หากคุณกำลังใช้pew
คุณสามารถใช้คำสั่งwipeenv :
pew wipeenv [env]
ฉันใช้ตัวเลือก - ผู้ใช้เพื่อถอนการติดตั้งแพ็คเกจทั้งหมดที่ติดตั้งในเว็บไซต์ผู้ใช้
แช่แข็ง pip3 --user | xargs pip3 ถอนการติดตั้ง -y
Pip ไม่มีทางรู้ได้ว่ามีการติดตั้งแพ็คเกจใดและผู้จัดการแพ็คเกจของคุณติดตั้งแพคเกจใดบ้าง สำหรับสิ่งนี้คุณจะต้องทำอะไรแบบนี้
สำหรับ distros ที่ใช้ rpm (แทนที่ python2.7 ด้วยเวอร์ชัน python ที่คุณติดตั้ง pip ด้วย):
find /usr/lib/python2.7/ |while read f; do
if ! rpm -qf "$f" &> /dev/null; then
echo "$f"
fi
done |xargs rm -fr
สำหรับการแจกแจงแบบอิงเดบิต:
find /usr/lib/python2.7/ |while read f; do
if ! dpkg-query -S "$f" &> /dev/null; then
echo "$f"
fi
done |xargs rm -fr
จากนั้นเพื่อล้างไดเรกทอรีว่างที่เหลืออยู่:
find /usr/lib/python2.7 -type d -empty |xargs rm -fr
ฉันพบคำตอบที่ทำให้เข้าใจผิดมากเพราะจะลบแพ็กเกจหลาม (ส่วนใหญ่?) ออกจากการแจกจ่ายของคุณและอาจทำให้คุณมีระบบที่ใช้งานไม่ได้
dpkg-query -S '/usr/lib/python2.7/*'
แตกชื่อและdpkg-query -L
แต่ละชื่อเพื่อดัมพ์ไฟล์ที่เกี่ยวข้อง? มันมีรายการที่เตรียมไว้แล้ว ข้อคัดค้านหลักของฉันคือแทนที่จะกำหนดเป้ แสดงรายการแพคเกจที่ติดตั้งภายในและบางคนแม้จะpip list -l
pip install --target=...
การถอดไดเออร์ที่ว่างเปล่าในปัจจุบันทั้งหมดจะกัดคุณเช่นกัน!