स्थापना रद्द करने के साथ-साथ संकुल को संस्थापित करने के लिए मैं पाइप आवश्यकताओं की फ़ाइल का उपयोग कैसे कर सकता हूँ?


93

मेरे पास एक पाइप आवश्यकताओं की फ़ाइल है जो विकास के दौरान बदलती है।

क्या pipउन पैकेजों की स्थापना रद्द करने के लिए बनाया जा सकता है जो आवश्यकताओं फ़ाइल में प्रकट नहीं होते हैं और साथ ही जो दिखाई देते हैं उन्हें स्थापित करना है? क्या कोई मानक विधि है?

यह पाइप आवश्यकताओं की फाइल को संकुल की विहित सूची बनाने की अनुमति देगा - एक 'यदि और केवल यदि' दृष्टिकोण।

अपडेट : मैंने इसे https://github.com/pypa/pip/issues/716 पर एक नई सुविधा के रूप में सुझाया


3
क्या आप वास्तव में पाइप को अनियंत्रित पैकेजों की स्थापना रद्द करना चाहते हैं क्योंकि आपके कार्यक्रम को उनकी आवश्यकता नहीं है? थोड़ा खतरनाक लगता है ...
स्कॉट हंटर

11
@ScottHunter यदि आप साइट पैकेज के बिना एक virtualenv में हैं, तो यह एक उचित बात करना चाहते हैं।
माइकल मियोर

1
@ScottHunter हाँ यदि नियंत्रित (आभासी) वातावरण का उपयोग कर रहा हूँ जहाँ मैं चाहता हूँ कि वहाँ क्या है - और यह कुछ और मौजूद नहीं है जो संभवतः समस्याओं का कारण बन सकता है, जैसे अप्रत्याशित निर्भरताएँ।
13

@MichaelMior यदि वह जवाब है तो कृपया उत्तर के रूप में जोड़ें और मैं इसे स्वीकार करूंगा!
13

@ वोडो डन। केवल एक कारण जो मैंने उत्तर के रूप में पोस्ट नहीं किया है, क्योंकि संभवतः एक अधिक उपयोगी समाधान है जो आपको वही मिल सकता है जो आप चाहते हैं।
माइकल मियोर

जवाबों:


17

संक्षिप्त उत्तर नहीं है, आप पाइप से ऐसा नहीं कर सकते।


33
जैसा कि स्टीफन नीचे कहते हैं:pip uninstall -r requirements.txt
ओमित

32
@Ommit यह उन पैकेजों को अनइंस्टॉल नहीं करता है जो आवश्यकताओं फ़ाइल में दिखाई नहीं देते हैं। यह उन सभी पैकेजों को पुनर्स्थापित करता है जो फ़ाइल में दिखाई देते हैं।
माइकल मिओर

3
@ मिचल मीर, आह, मैंने मूल प्रश्न पर पर्याप्त ध्यान नहीं दिया। मेरी गलती।
ओमित

5
-yY को दबाने और कई बार दर्ज करने से बचने के लिए @Ommit की कमांड जोड़ें । मेरी गलतियों से सीखो।
ग्रेग हिल्स्टन

2
बस जोड़ने के लिए: pip uninstall -r requirements.txtकेवल अपनी आवश्यकताओं में संस्करणों की स्थापना रद्द करें। यदि आप boto3==1.10.0उदाहरण के लिए अनइंस्टॉल करते हैं, तो pip freezeयह दिखाएगा boto3==1.0.1कि क्या आपने इसे पहले (या किसी पुराने संस्करण) स्थापित किया है।
जॉर्डन मैकी

126

यह आवश्यकताओं में नहीं कुछ भी अनइंस्टॉल करना चाहिए।

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

2016 के लिए अपडेट: आप वास्तव में वास्तव में उपरोक्त दृष्टिकोण का उपयोग नहीं करना चाहते हैं, हालांकि। बाहर की जाँच करें pip-toolsऔरpip-sync जो आप शायद अधिक मजबूत तरीके से करने के लिए देख रहे हैं जो पूरा करते हैं।

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

मई, 2016 के लिए अपडेट:

अब आप भी उपयोग कर सकते हैं pip uninstall -r requirements.txt, हालांकि यह मूल रूप से विपरीत को पूरा करता है - यह सब कुछ में बहाल करता हैrequirements.txt

मई, 2019 के लिए अपडेट:

पिपेनव की जाँच करें । पैकेज प्रबंधन की दुनिया में बहुत कुछ हुआ है जो इस तरह के प्रश्न को थोड़ा अप्रचलित करता है। मैं वास्तव में अभी भी बहुत खुशी से पाइप-टूल्स का उपयोग कर रहा हूं, हालांकि।


5
वह अच्छा रहेगा। मुझे लगता है कि अगर वे अपनी आवश्यकताओं को अपडेट किए बिना मैन्युअल रूप से एक होस्ट पर कुछ स्थापित करते हैं तो सब कुछ तोड़कर अपनी निर्भरता के बारे में स्पष्ट होने के लिए देवों को मजबूर करने का एक अच्छा तरीका लगता है। मुझे यह देखने में रुचि होगी कि किस प्रकार का फीडबैक एक कार्यक्षमता जोड़ने के लिए अनुरोध करेगा।
स्टीफन फेरी

यह सही जवाब है! मैंने इसे अपनी project.configफाइल में Django के लिए इलास्टिक बीनस्टॉक पर रखा है 05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y":। अब मैं केवल टिप्पणियों का उपयोग करके अपने वातावरण के पुनर्निर्माण के बिना पाइप पैकेज को रोलबैक कर सकता हूं requirements.txt। यह मुझे वास्तविक डाउनटाइम बचा रहा है। धन्यवाद!
e.thompsy

क्या कभी पाइप फ्रीज़ का उत्पादन # से शुरू होता है? दूसरे शब्दों में, क्या दूसरा grep आवश्यक है?
Xor

1
निश्चित नहीं है कि अगर कोई pip freezeटिप्पणी करता है, लेकिन किसी दिन वे इसे एपीआई में जोड़ सकते हैं, और यदि वे करते हैं, तो यह मान्य होगा। यदि वे नहीं करते हैं, तो ऊपर एक नहीं सेशन है। डैश आपको पिछली कमांड से स्टडिन का उपयोग करने की अनुमति देता है, इस मामले में, डैश grep को आवश्यकताओं की सामग्री की तुलना करने के लिए कह रहा है। इसके आउटपुट के लिए तुलना करें pip freeze( pip freezeइस संदर्भ में आउटपुट
स्टड

1
मैंने पाइप-टूल्स की अत्यधिक सिफारिश की। +1
रॉन रोथमैन

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 यदि वे आपकी आवश्यकताओं की फ़ाइल में नहीं हैं और वे पहले से ही स्थापित हैं, तो संकलन को फिर से कभी नहीं होना चाहिए।
माइकल मेयोर

1
@MichaelMior - जब तक आप नहीं थे, कहते हैं, पूरे virtualenv को मिटा दें, जैसा कि यह उत्तर बताता है।
मेलिनाथ

1
@melinath लेकिन अगर आप virtualenv मिटा देते हैं और पैकेज की आवश्यकता नहीं है (और आपके में नहीं requirements.txt), तो इसे फिर से क्यों स्थापित किया जाएगा?
माइकल मेयोर

3
@MichaelMior मैं अपनी मूल टिप्पणी को अधिक स्पष्ट रूप से बताने की कोशिश करूँगा। ऐसा लगता है कि आप उस बिंदु को गलत समझ सकते हैं जो मैं बना रहा था। एक साधारण आवश्यकताओं की फाइल की कल्पना करें जिसमें PIL और lxml शामिल हैं। लेकिन फिर आप तय करते हैं कि आपको किसी भी अधिक lxml की आवश्यकता नहीं है, और आप इसे आवश्यकताओं फ़ाइल से हटा देते हैं। यदि आप इस उत्तर के अनुसार सुझाव देते हैं, और virtualenv को मिटा देते हैं, तो आपको PIL को फिर से स्थापित करना होगा (और recompile) करना होगा। यह अधिक कुशल होगा बस lxml की स्थापना रद्द करने का विकल्प होगा (यानी सभी पैकेज आवश्यकताओं की फाइल में नहीं।)
मेलानाथ

11

अब आप -r requirements.txtतर्क पास कर सकते हैं pip 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
यह उन पैकेजों को अनइंस्टॉल नहीं करता है जो फाइल में नहीं दिखते हैं। यह संकुल जो अपनी स्थापना रद्द करते फ़ाइल में दिखाई देते हैं।
माइकल मिओर

4

यह एक पुराना सवाल है (लेकिन अच्छा है), और चीजों को काफी हद तक बदल दिया गया है क्योंकि यह पूछा गया था।

एक pip-syncअन्य जवाब में एक अपमानजनक संदर्भ है , लेकिन अपने स्वयं के उत्तर के हकदार हैं, क्योंकि यह ओपी की समस्या को हल करता है।

पाइप-सिंक एक requirements.txtफाइल को इनपुट के रूप में लेता है , और आपके वर्तमान पायथन वातावरण को "ट्रू अप" करता है ताकि यह वास्तव में उसी से मेल खाता हो 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 requirements.txt
> pip freeze
libA==1.0
libB==1.1
libC==1.2

सावधान, यदि आपके पास विश्व स्तर पर स्थापित पाइप-टूल हैं, तो यह आपके वर्तमान में सक्रिय वर्चुअन में अनइंस्टॉल नहीं करेगा ... अभी भी अजीब है, लेकिन अन्यथा सबसे सीधे आगे की आवश्यकता प्रबंधन उपकरण मुझे पता है।
बेन्ज़की

3

स्टीफन का प्रस्ताव एक अच्छा विचार है, लेकिन दुर्भाग्य से यह काम नहीं करता है यदि आप अपनी फ़ाइल में केवल प्रत्यक्ष आवश्यकताओं को शामिल करते हैं, जो मुझे साफ लगता है।

सभी निर्भरता की स्थापना रद्द कर दी जाएगी, यहां तक ​​कि खुद को distributeतोड़कर भी pip

एक आभासी वातावरण पर नज़र रखने वाले संस्करण के दौरान स्वच्छ आवश्यकताओं की फाइल बनाए रखना

यहां बताया गया है कि मैं अपने वर्चुअल वातावरण को कैसे ट्रैक करता हूं। मैं requirements.txtकेवल प्रत्यक्ष आवश्यकताओं सहित न्यूनतम को बनाए रखने की कोशिश करता हूं , और संस्करण की कमी का भी उल्लेख नहीं करता हूं जहां मुझे यकीन नहीं है।

लेकिन इसके अलावा, मैं एक venv.pipफ़ाइल में मेरे वर्चुअन की वास्तविक स्थिति को संस्करण ट्रैकिंग (गिट कहो) में रखता हूं और शामिल करता हूं ।

यहाँ एक नमूना वर्कफ़्लो है:


वर्चुअन ट्रैकिंग के साथ सेटअप वर्चुअन कार्यक्षेत्र:

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

मुझे लगता है कि प्रक्रिया को हुक हुक के साथ स्वचालित किया जा सकता है, लेकिन चलो विषय से दूर नहीं जाते हैं।

बेशक, यह समझ में आता है कि कुछ पैकेज कैशिंग सिस्टम या स्थानीय रिपॉजिटरी का उपयोग करने के लिए जैसे pip2pi


2

यहाँ @ स्टीफन-जे-फुहेरी से पिग्गीबैकिंग एक पॉवरशेल बराबर है जिसका मैं उपयोग करता हूं:

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
यह उन पैकेजों को अनइंस्टॉल नहीं करता है जो आवश्यकताओं फ़ाइल में दिखाई नहीं देते हैं। यह सब संकुल जो अपनी स्थापना रद्द करते फ़ाइल में दिखाई देते हैं।
बजे माइकल माइर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.