ฉันจะใช้ไฟล์ข้อกำหนด pip เพื่อถอนการติดตั้งและติดตั้งแพ็คเกจได้อย่างไร


93

ฉันมีไฟล์ข้อกำหนด pip ที่เปลี่ยนแปลงระหว่างการพัฒนา

สามารถpipทำการถอนการติดตั้งแพ็กเกจที่ไม่ปรากฏในไฟล์ความต้องการรวมทั้งการติดตั้งแพ็กเกจที่ปรากฏได้หรือไม่? มีวิธีมาตรฐานหรือไม่?

สิ่งนี้จะช่วยให้ไฟล์ข้อกำหนด pip เป็นรายการมาตรฐานของแพ็กเกจ - วิธีการ 'if and only if'

อัปเดต : ฉันแนะนำเป็นคุณลักษณะใหม่ที่https://github.com/pypa/pip/issues/716


3
คุณต้องการให้ pip ถอนการติดตั้งแพ็คเกจโดยพลการเพียงเพราะโปรแกรมของคุณไม่ต้องการหรือไม่? ฟังดูอันตรายเล็กน้อย ...
Scott Hunter

11
@ScottHunter หากคุณอยู่ใน Virtualenv โดยไม่มีแพ็คเกจไซต์มันเป็นสิ่งที่สมเหตุสมผลที่คุณอยากจะทำ
Michael Mior

1
@ScottHunter ใช่ถ้าใช้สภาพแวดล้อมแบบควบคุม (เสมือน) ที่ฉันต้องการแน่ใจว่ามีอะไรอยู่ - และไม่มีสิ่งอื่นใดที่อาจทำให้เกิดปัญหาเช่นการอ้างอิงที่ไม่คาดคิด
wodow

@MichaelMior ถ้านั่นคือคำตอบโปรดเพิ่มเป็นคำตอบและฉันจะยอมรับมัน!
wodow

@wodow เสร็จแล้ว. เหตุผลเดียวที่ฉันไม่ได้โพสต์เป็นคำตอบเพราะอาจมีวิธีแก้ปัญหาที่เป็นประโยชน์มากกว่าที่จะช่วยให้คุณได้รับสิ่งที่คุณต้องการ
Michael Mior

คำตอบ:


17

คำตอบสั้น ๆ คือไม่คุณไม่สามารถทำได้ด้วย pip


33
ตามที่สตีเฟนกล่าวไว้ด้านล่าง:pip uninstall -r requirements.txt
โอม

32
@Ommit นี่ไม่ได้ถอนการติดตั้งแพ็คเกจที่ไม่ปรากฏในไฟล์ข้อกำหนด ถอนการติดตั้งแพ็คเกจทั้งหมดที่ปรากฏในไฟล์
Michael Mior

3
@Micheal Mior อาฉันไม่ได้ใส่ใจกับคำถามเดิมมากพอ ความผิดฉันเอง.
ออมสิน

5
เพิ่ม-yคำสั่งใน @Ommit เพื่อหลีกเลี่ยงการกด Y และป้อนหลาย ๆ ครั้ง เรียนรู้จากความผิดพลาดของฉัน
Greg Hilston

2
เพียงเพื่อเพิ่ม: pip uninstall -r requirements.txtจะถอนการติดตั้งเวอร์ชันในข้อกำหนดของคุณ txt เท่านั้น boto3==1.10.0ตัวอย่างเช่นหากคุณถอนการติดตั้งpip freezeจะแสดงboto3==1.0.1ว่าคุณได้ติดตั้งไว้ก่อนหน้านี้ (หรือเวอร์ชันเก่ากว่า)
Jordan Mackie

126

สิ่งนี้ควรถอนการติดตั้งสิ่งที่ไม่อยู่ใน requirements.txt:

pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y

แม้ว่าสิ่งนี้จะใช้ไม่ได้กับแพ็กเกจที่ติดตั้ง-eเช่นจากที่เก็บ git หรือที่คล้ายกัน หากต้องการข้ามสิ่งเหล่านี้ให้กรองแพ็กเกจที่ขึ้นต้นด้วย-eแฟล็ก:

pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y

จากนั้นเห็นได้ชัดว่า:

pip install -r requirements.txt

อัปเดตสำหรับปี 2559: คุณอาจไม่ต้องการใช้วิธีการข้างต้นจริงๆ ตรวจสอบpip-toolsและpip-syncสิ่งใดที่บรรลุผลสำเร็จในสิ่งที่คุณอาจต้องการทำด้วยวิธีที่แข็งแกร่งกว่า

https://github.com/nvie/pip-tools

อัปเดตประจำเดือนพฤษภาคม 2559:

ตอนนี้คุณสามารถใช้งานได้pip uninstall -r requirements.txtแล้วอย่างไรก็ตามสิ่งนี้ทำได้ในทางตรงกันข้าม - ถอนการติดตั้งทุกอย่างrequirements.txt

อัปเดตประจำเดือนพฤษภาคม 2019:

ตรวจสอบpipenv มีหลายสิ่งเกิดขึ้นในโลกของการจัดการแพ็คเกจที่ทำให้คำถามประเภทนี้ล้าสมัยไปหน่อย จริงๆแล้วฉันยังค่อนข้างมีความสุขกับการใช้ pip-tools


5
คงจะดีไม่น้อย สำหรับฉันแล้วดูเหมือนเป็นวิธีที่ดีในการบังคับให้ devs มีความชัดเจนเกี่ยวกับการอ้างอิงของพวกเขาโดยทำลายทุกอย่างหากพวกเขาติดตั้งบางสิ่งในโฮสต์เดียวด้วยตนเองโดยไม่ต้องอัปเดตความต้องการ txt ฉันสนใจที่จะดูว่าคำขอดึงเพิ่มฟังก์ชันนั้นจะสร้างความคิดเห็นประเภทใด
Stephen Fuhry

นี่คือคำตอบที่ถูกต้อง! ฉันใส่ในของฉันproject.configไฟล์สำหรับ Django 05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"ในยืดหยุ่นฝักถั่ว: ตอนนี้ฉันสามารถย้อนกลับแพ็คเกจ pip โดยไม่ต้องสร้างสภาพแวดล้อมของฉันใหม่เพียงแค่ใช้ความคิดเห็นในrequirements.txt. นี่ช่วยประหยัดเวลาหยุดทำงานจริง ขอขอบคุณ!
e.thompsy

เคยมีผลลัพธ์ของการหยุด pip ที่เริ่มต้นด้วย # หรือไม่ กล่าวอีกนัยหนึ่ง grep ที่สองจำเป็นหรือไม่?
xor

1
ไม่แน่ใจว่าpip freezeแสดงความคิดเห็นหรือไม่ แต่สักวันพวกเขาอาจเพิ่มลงใน API และหากทำเช่นนั้นก็จะถูกต้อง หากไม่เป็นเช่นนั้นสิ่งที่กล่าวมาข้างต้นจะเป็นการไม่ดำเนินการ เส้นประช่วยให้คุณสามารถใช้ stdin จากคำสั่งก่อนหน้าได้ในกรณีนี้เส้นประกำลังบอก grep เพื่อเปรียบเทียบเนื้อหาของ requirements.txt กับผลลัพธ์ของpip freeze(ผลลัพธ์ของpip freezeในบริบทนี้ตรงกันกับ stdin)
Stephen Fuhry

1
ฉันขอแนะนำเครื่องมือ pip +1
ron rothman

16

ไม่ใช่คุณสมบัติของpipไม่มี หากคุณต้องการสิ่งนั้นจริงๆคุณสามารถเขียนสคริปต์เพื่อเปรียบเทียบผลลัพธ์pip freezeกับของคุณrequirements.txtได้ แต่มันน่าจะยุ่งยากกว่าที่ควรจะเป็น

การใช้virtualenvมันง่ายกว่าและน่าเชื่อถือกว่าในการสร้างสภาพแวดล้อมที่สะอาดและ (ใหม่) ติดตั้งจากrequirements.txtเช่น:

deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt

6
อาจเป็นประโยชน์ในการถอนการติดตั้งแพ็กเกจที่ไม่ได้อยู่ในไฟล์ข้อกำหนดหากแพ็กเกจบางแพ็กเกจ (PIL, lxml ฯลฯ ) ต้องการการคอมไพล์ที่ยาวนานโดยเฉพาะอย่างยิ่งหากเกิดขึ้นบนเซิร์ฟเวอร์สดที่ใช้สภาพแวดล้อมเสมือน
melinath

@melinath หากไม่ได้อยู่ในไฟล์ความต้องการของคุณและได้รับการติดตั้งแล้วการคอมไพล์ก็ไม่ควรเกิดขึ้นอีก
Michael Mior

1
@ MichaelMior - เว้นแต่คุณจะพูดเช็ดคุณธรรมทั้งหมดตามที่คำตอบนี้แนะนำ
melinath

1
@melinath แต่ถ้าคุณเช็ด Virtualenv และไม่จำเป็นต้องใช้แพ็คเกจ (และไม่ได้อยู่ในแพ็คเกจของคุณrequirements.txt) ทำไมถึงต้องติดตั้งอีกครั้ง?
Michael Mior

3
@MichaelMior ฉันจะพยายามระบุความคิดเห็นเดิมของฉันให้ชัดเจนมากขึ้น ดูเหมือนว่าคุณอาจเข้าใจผิดในประเด็นที่ฉันทำ ลองนึกภาพไฟล์ข้อกำหนดง่ายๆที่มี PIL และ lxml แต่คุณตัดสินใจว่าไม่ต้องการ lxml อีกต่อไปและคุณลบออกจากไฟล์ข้อกำหนด หากคุณทำตามที่คำตอบนี้แนะนำและล้าง Virtualenv คุณจะต้องติดตั้ง PIL (และคอมไพล์ใหม่) ใหม่ มันจะมีประสิทธิภาพมากกว่าหากมีตัวเลือกในการถอนการติดตั้ง lxml (เช่นแพ็คเกจทั้งหมดที่ไม่อยู่ในไฟล์ข้อกำหนด)
melinath

11

ตอนนี้คุณสามารถผ่านอาร์กิวเมนต์-r requirements.txtpip uninstall

pip uninstall -r requirements.txt -y

อย่างน้อย ณpip8.1.2 การpip help uninstallแสดง:

...
Uninstall Options:
  -r, --requirement <file>    Uninstall all the packages listed in the given requirements file.  This option can be
                              used multiple times.
...

3
ไม่ได้ถอนการติดตั้งแพ็กเกจที่ไม่ปรากฏในไฟล์ มันถอนการติดตั้งแพคเกจที่ทำปรากฏในแฟ้ม
Michael Mior

4

นี่เป็นคำถามเก่า (แต่เป็นคำถามที่ดี) และสิ่งต่างๆได้เปลี่ยนแปลงไปอย่างมากนับตั้งแต่ถูกถาม

มีการอ้างอิงถึงpip-syncในคำตอบอื่น แต่สมควรได้รับคำตอบของตัวเองเพราะมันช่วยแก้ปัญหาของ OP ได้อย่างแม่นยำ

pip ซิงค์ใช้requirements.txtไฟล์เป็น input และ "trues ขึ้น" สภาพแวดล้อมหลามปัจจุบันของคุณเพื่อให้ตรงกับว่าrequirements.txtสิ่งที่อยู่ในนั้น ซึ่งรวมถึงการเอาแพคเกจใด ๆ ที่มีอยู่ใน env ของคุณ requirements.txtแต่ขาดจาก

ตัวอย่าง: สมมติว่าเราต้องการ env ของเราที่จะมี (เท่านั้น) 3 ห้องสมุด: libA, libBและlibCเช่นดังนั้น:

> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2

แต่ปัจจุบัน env ของเราประกอบด้วยlibCและlibD:

> pip freeze
libC==1.2
libD==1.3

การเรียกใช้ pip-sync จะทำให้เกิดสิ่งนี้ซึ่งเป็นสถานะสุดท้ายที่เราต้องการ:

> pip-sync requirements.txt
> pip freeze
libA==1.0
libB==1.1
libC==1.2

ระวังถ้าคุณมีเครื่องมือ pip ที่ติดตั้งไว้ทั่วโลกมันจะไม่ถอนการติดตั้งใน Virtualenv ที่เปิดใช้งานอยู่ในปัจจุบันของคุณ ... ยังคงแปลก แต่อย่างอื่นเครื่องมือจัดการความต้องการที่ตรงไปตรงมาที่สุดที่ฉันรู้
benzkji

3

ข้อเสนอของ Stephen เป็นความคิดที่ดี แต่น่าเสียดายที่ไม่ได้ผลหากคุณใส่เฉพาะข้อกำหนดโดยตรงในไฟล์ซึ่งฟังดูสะอาดกว่าสำหรับฉัน

การอ้างอิงทั้งหมดจะถูกถอนการติดตั้งรวมถึงแม้กระทั่งการdistributeทำลายpipตัวเอง

การรักษาไฟล์ข้อกำหนดที่สะอาดในขณะที่เวอร์ชันติดตามสภาพแวดล้อมเสมือน

นี่คือวิธีที่ฉันพยายามติดตามเวอร์ชันสภาพแวดล้อมเสมือนของฉัน ฉันพยายามรักษาเพียงเล็กน้อยrequirements.txtรวมถึงข้อกำหนดโดยตรงเท่านั้นและไม่ได้พูดถึงข้อ จำกัด ของเวอร์ชันที่ฉันไม่แน่ใจ

แต่นอกจากนี้ฉันยังเก็บและรวมไว้ในการติดตามเวอร์ชัน (พูดว่า git) สถานะจริงของ Virtualenv ของฉันในvenv.pipไฟล์

นี่คือตัวอย่างเวิร์กโฟลว์:


ติดตั้งพื้นที่ทำงาน Virtualenv พร้อมการติดตามเวอร์ชัน:

mkdir /tmp/pip_uninstalling
cd /tmp/pip_uninstalling
virtualenv venv
. venv/bin/activate

เริ่มต้นระบบติดตามเวอร์ชัน:

git init
echo venv > .gitignore
pip freeze > venv.pip
git add .gitignore venv.pip
git commit -m "Python project with venv"

ติดตั้งแพ็คเกจที่มีการอ้างอิงรวมไว้ในไฟล์ข้อกำหนด:

echo flask > requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip

ตอนนี้เริ่มสร้างแอปของคุณจากนั้นยอมรับและเริ่มสาขาใหม่:

vim myapp.py
git commit -am "Simple flask application"
git checkout -b "experiments"

ติดตั้งแพ็คเกจเสริม:

echo flask-script >> requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip

... เล่นกับมันแล้วกลับมาที่เวอร์ชันก่อนหน้า

vim manage.py
git commit -am "Playing with flask-script"
git checkout master

ตอนนี้ถอนการติดตั้งแพ็คเกจภายนอก:

pip freeze | grep -v -f venv.pip | xargs pip uninstall -y

ฉันคิดว่ากระบวนการสามารถเป็นไปโดยอัตโนมัติด้วย git hooks แต่อย่าไปนอกหัวข้อ

แน่นอนว่าควรใช้ระบบแคชแพ็กเกจหรือพื้นที่เก็บข้อมูลในเครื่องเช่นpip2pi


2

Piggybacking off @ stephen-j-fuhry ที่นี่เทียบเท่า powershell ที่ฉันใช้:

pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }

0

แม้ว่าสิ่งนี้จะไม่ตอบคำถามโดยตรง แต่ทางเลือกที่ดีกว่าสำหรับrequirements.txtตอนนี้คือการใช้ไฟล์Pipfile. Gemfileฟังก์ชั่นนี้คล้ายกับทับทิม ขณะนี้คุณต้องการที่จะทำให้การใช้งานของpipenvเครื่องมือ pipแต่หวังว่าจะได้รับการรวมอยู่ใน สิ่งนี้ให้pipenv cleanคำสั่งที่ทำในสิ่งที่คุณต้องการ

(หมายเหตุที่คุณสามารถนำเข้าที่มีอยู่requirements.txtด้วยpipenv install -r requirements.txt. หลังจากนี้คุณควรจะมีPipfileและrequirements.txtสามารถถอดออกได้.)


-3

เป็นไปได้แล้วโดยใช้:

pip uninstall -r requirements.txt

2
สิ่งนี้ไม่ได้ถอนการติดตั้งแพ็คเกจที่ไม่ปรากฏในไฟล์ข้อกำหนด มันถอนการติดตั้งแพ็กเกจทั้งหมดที่ทำปรากฏในแฟ้ม
Michael Mior
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.