Paketleri kaldırmak ve kurmak için pip gereksinimleri dosyasını nasıl kullanabilirim?


93

Geliştirme sırasında değişen bir pip gereksinimleri dosyam var.

Can pipyapılacak kaldırma görünen sitelerde ise yüklemeden yanı sıra gereksinimleri dosyasında görünmez paketleri? Standart bir yöntem var mı?

Bu, pip gereksinimleri dosyasının standart paket listesi olmasını sağlar - bir 'eğer ve ancak eğer' yaklaşımı.

Güncelleme : Bunu https://github.com/pypa/pip/issues/716 adresinde yeni bir özellik olarak önerdim


3
Programınız gerektirmediği için rasgele paketleri kaldırmayı GERÇEKTEN istiyor musunuz? Kulağa biraz tehlikeli geliyor ...
Scott Hunter

11
@ScottHunter Site paketleri olmayan bir virtualenv içindeyseniz, yapmak isteyebileceğiniz makul bir şeydir.
Michael Mior

1
@ScottHunter Evet, orada ne olduğundan emin olmak istediğim kontrollü (sanal) bir ortam kullanılıyorsa - ve bu sorunlara neden olabilecek başka hiçbir şey yok, örneğin beklenmedik bağımlılıklar.
wodow

@MichaelMior Eğer cevap buysa, lütfen bir cevap olarak ekleyin, ben de kabul edeceğim!
wodow

@wodow Bitti. Cevap olarak göndermememin tek nedeni, sizi istediğiniz şeye ulaştıracak muhtemelen daha yararlı bir çözümün olmasıdır.
Michael Mior

Yanıtlar:


17

Kısa cevap hayır, bunu pip ile yapamazsınız.


33
Stephen'ın aşağıda söylediği gibi:pip uninstall -r requirements.txt
Ommit

32
@Ommit Bu, gereksinimler dosyasında görünmeyen paketleri kaldırmaz. Dosyada görünen tüm paketleri kaldırır.
Michael Mior

3
@Micheal Mior, ah, orijinal soruya yeterince dikkat etmedim. Benim hatam.
Ommit

5
-yY'ye basmak ve birçok kez girmek zorunda kalmamak için @Ommit'e bir komut ekleyin . Hatalarımdan ders alın.
Greg Hilston

2
Yalnızca eklemek için: pip uninstall -r requirements.txtyalnızca gereksinimler.txt'nizdeki sürümleri kaldırır. boto3==1.10.0Örneğin kaldırırsanız , pip freezedaha boto3==1.0.1önce (veya daha eski bir sürüm) yükleyip kurmadığınızı gösterecektir .
Jordan Mackie

126

Bu, requirements.txt dosyasında olmayan her şeyi kaldırmalıdır:

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

Bununla birlikte -e, bu, bir git deposundan veya benzeri bir kaynaktan yüklenen paketlerde tam olarak doğru çalışmayacaktır . Bunları atlamak için, -ebayrakla başlayarak paketleri filtrelemeniz yeterlidir:

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

Sonra, belli ki:

pip install -r requirements.txt

2016 Güncellemesi: Muhtemelen yukarıdaki yaklaşımı gerçekten kullanmak istemezsiniz. Kontrol edin pip-toolsvepip-sync hangisini muhtemelen yapmak istediğinizi çok daha sağlam bir şekilde başarın.

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

Mayıs 2016 Güncellemesi:

Artık kullanabilirsiniz pip uninstall -r requirements.txt, ancak bu temelde tam tersini gerçekleştirir - içindeki her şeyi kaldırırrequirements.txt

Mayıs 2019 güncellemesi:

Check pipenv . Paket yönetimi dünyasında, bu tür soruları biraz modası geçmiş hale getiren çok şey oldu. Aslında hala pip araçlarını kullanmaktan oldukça memnunum.


5
İyi olur. Gereksinim.txt dosyasını güncellemeden bir ana bilgisayara manuel olarak bir şey yüklerlerse geliştiricileri bağımlılıkları konusunda açık olmaya zorlamanın iyi bir yolu gibi görünüyor. Bu işlevselliği ekleyen bir çekme talebinin ne tür geri bildirim oluşturacağını görmek isterim.
Stephen Fuhry

Bu doğru cevap! Benim bu koymak project.configElastik Beanstalk üzerinde Django için dosyanın: 05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y". Artık pip paketlerini yalnızca içindeki yorumları kullanarak ortamımı yeniden oluşturmadan geri alabilirim requirements.txt. Bu beni gerçek aksama sürelerinden kurtarıyor. Teşekkür ederim!
e.thompsy

# ile başlayan bir pip donma çıkışı var mı? Başka bir deyişle, ikinci grep gerekli mi?
xor

1
pip freezeYorum yapıp yapmadığından emin değilim , ancak bir gün bunu API'ye ekleyebilirler ve yaparlarsa geçerli olacaktır. Yapmazlarsa, yukarıdakiler işlemsizdir. Çizgi, önceki komuttan stdin'i kullanmanıza izin verir, bu durumda, çizgi grep'e gereksinim.txt'nin içeriğini ( bu bağlamdaki pip freezeçıktısı pip freezestdin ile eş anlamlıdır) karşılaştırmasını söyler
Stephen Fuhry

1
Pip aletlerini şiddetle tavsiye ediyorum. +1
ron rothman

16

Hayır'ın bir özelliği değil pip. Gerçekten böyle bir şey istiyorsanız, çıktısını pip freezekendinizle karşılaştırmak için bir komut dosyası yazabilirsiniz requirements.txt, ancak muhtemelen değerinden daha güçlük çekecektir.

Kullanarak virtualenv, temiz bir ortam oluşturmak ve aşağıdakiler gibi (yeniden) yüklemek daha kolay ve daha güvenilirdir requirements.txt:

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

6
Bazı paketler (PIL, lxml, vb.) Uzun derleme gerektiriyorsa - özellikle bu sanal ortamı kullanan canlı bir sunucuda gerçekleşiyorsa, gereksinim dosyasında bulunmayan paketleri kaldırmak yararlı olabilir.
melinath

@melinath Gereksinimler dosyanızda yoksa ve zaten yüklenmişlerse, derleme bir daha asla yapılmamalıdır.
Michael Mior

1
@MichaelMior - bu cevabın da önerdiği gibi, diyelim ki tüm virtualenv'i silmediğiniz sürece.
melinath

1
@melinath Ama eğer virtualenv'i silerseniz ve paket gerekli değilse (ve sizin paketinizde değilse requirements.txt), neden tekrar kurulsun?
Michael Mior

3
@MichaelMior Orijinal yorumumu daha açık bir şekilde ifade etmeye çalışacağım. Söylediğim noktayı yanlış anlamış gibisin. PIL ve lxml içeren basit bir gereksinimler dosyası düşünün. Ama sonra artık lxml'ye ihtiyacınız olmadığına karar verirsiniz ve bunu gereksinimler dosyasından kaldırırsınız. Bu cevabın önerdiği gibi yaparsanız ve virtualenv'i silerseniz, PIL'i yeniden yüklemeniz (ve yeniden derlemeniz) gerekir. Sadece
lxml'yi

11

Şimdi -r requirements.txtargümanı 'a iletebilirsiniz pip uninstall.

pip uninstall -r requirements.txt -y

En az pip8.1.2 itibariyle , şunu pip help uninstallgösterir:

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

3
Bu, dosyada görünmeyen paketleri kaldırmaz. Bu paketleri kaldırır dosyasında görünür.
Michael Mior

4

Bu eski bir sorudur (ama iyi bir sorudur) ve sorulduğundan bu yana işler önemli ölçüde değişti.

pip-syncBaşka bir cevapta hazırlıksız bir referans var , ancak kendi cevabını hak ediyor, çünkü OP'nin problemini tam olarak çözüyor.

Pip-senkron bir sürer requirements.txto eşleşecek şekilde geçerli Python ortamında "yukarı doğruları" girdi olarak dosyası ve tam olarak o içinde ne requirements.txt. Bu, ortamınızda bulunan ancak bulunmayan tüm paketleri kaldırmayı içerir requirements.txt.

Örnek: bizim env (sadece) 3 kütüphaneler içermesini istediğiniz varsayalım libA, libBve libCböylece gibi:

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

Ama env anda içerir libCve libD:

> pip freeze
libC==1.2
libD==1.3

Pip-sync'i çalıştırmak, istediğimiz son durumla sonuçlanacaktır:

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

dikkat edin, eğer global olarak kurulmuş bir pip-araçlarınız varsa, o anda aktif olan virtualenv'de kaldırılmayacaktır ... yine de garip, ama aksi halde bildiğim en basit gereksinim yönetim aracıdır.
benzkji

3

Stephen'ın önerisi güzel bir fikir, ancak maalesef dosyanıza yalnızca doğrudan gereksinimler eklerseniz, bu bana daha temiz geliyorsa işe yaramaz.

Tüm bağımlılıklar bile dahil kaldırılacak distributeyıkarak pipkendisi.

Sürüm sanal bir ortamı izlerken temiz bir gereksinimler dosyasını korumak

İşte sanal ortamımın versiyonunu izlemeye nasıl çalıştığım. requirements.txtYalnızca doğrudan gereksinimler dahil olmak üzere minimum düzeyde tutmaya çalışıyorum ve emin olmadığım durumlarda sürüm kısıtlamalarından bahsetmiyorum bile.

Ancak bunun yanı sıra, sanal ortamımın gerçek durumunu bir venv.pipdosyada tutuyor ve sürüm izlemeye (git diyelim) dahil ediyorum .

İşte örnek bir iş akışı:


sürüm izleme ile virtualenv çalışma alanını kurun:

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

sürüm izleme sistemini başlatın:

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

bağımlılıkları olan bir paket yükleyin, gereksinimler dosyasına ekleyin:

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

Şimdi uygulamanızı oluşturmaya başlayın, ardından taahhütte bulunun ve yeni bir şube başlatın:

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

fazladan bir paket kurun:

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

... onunla oynayın ve ardından önceki sürüme dönün

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

Şimdi gereksiz paketleri kaldırın:

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

Sanırım işlem git kancaları ile otomatikleştirilebilir, ancak konu dışına çıkmayalım.

Tabii ki, o zaman bazı paket önbelleğe alma sistemi veya pip2pi gibi yerel depo kullanmak mantıklıdır.


2

@ Stephen-j-fuhry'de Piggybacking, kullandığım bir powershell eşdeğeri:

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

0

Bu, soruyu doğrudan yanıtlamasa da, requirements.txtşimdi daha iyi bir alternatif, a kullanmaktır Pipfile. Bu, Ruby'ye benzer şekilde çalışır Gemfile. Şu anda, pipenvaracı kullanmanız gerekiyor, ancak umarız bu eninde sonunda dahil edilecektir pip. Bu, istediğinizi yapan pipenv cleankomutu sağlar .

(Not Varolan içe ki requirements.txtile pipenv install -r requirements.txt. Bundan sonra bir olmalı Pipfileve requirements.txtçıkarılabilir.)


-3

Şimdi kullanmak mümkündür:

pip uninstall -r requirements.txt

2
Bu, gereksinimler dosyasında görünmeyen paketleri kaldırmaz. Tüm paketleri kaldırır dosyasında görünür.
Michael Mior
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.