Required.txt ile yüklerken pip'in tek bir pakette başarısız olmasını durdur


138

Şuradan paketleri kuruyorum requirements.txt

pip install -r requirements.txt

requirements.txtDosya okur:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxmlyüklenemeyen tek pakettir ve bu her şeyin başarısız olmasına yol açar (yorumlarda larsks tarafından belirtildiği gibi beklenen sonuçlar). Ancak, lxmlbaşarısız olduktan sonra piphala devam eder ve geri kalan paketleri indirir.

Anladığım kadarıyla, pip install -r requirements.txtlistede listelenen paketlerden herhangi biri kurulamazsa , komut başarısız olacaktır requirements.txt.

Çalışırken pip install -r requirements.txt, yapabileceklerini kurmasını ve yapamayacağı paketleri atlamasını ya da bir şeyin başarısız olduğunu görür görmez çıkmasını söylemek için geçebileceğim herhangi bir argüman var mı ?


3

1
Teşekkürler, bu durumda işe yarar, ama genel olarak, bunun etrafında herhangi bir yol var mı? Yoksa sadece komutu çalıştırmak, başarısız olduğunu görmek ve ardından paket listesini budamak normal mi?
emh

5
requirements.txtİçinde bir paket listelenmişse muhtemelen gereklidir , bu nedenle pippaket kurulamazsa başarısız olacağı mantıklıdır . Kod yine de bu paket olmadan çalışıyorsa, o zaman bu bir gereklilik değildi. Başarısız paketleri rastgele ayırmak requirements.txt, eksik bağımlılıklarla ilgili sorunlara neden olacak gibi görünüyor.
larsks

1
@larsks, tek bir geliştirme ortamı veya paketi için birden çok gereksinim.txt dosyasına sahip olmak çok yaygın olabilir. Örneğin, birim / entegrasyon test ortamını veya performans profillemesini geliştirmek için kullanılabilen, ancak kesinlikle gerekli olmayan bir dolu isteğe bağlı araç olabilir. Yine de bu paketleri ve sabitlenmiş sürümleri ifade eden tek bir kaynak dosyayı kontrol etmek pip install -r <some file>ve uygun ortamın oluşturulmasını standartlaştırmak için aynı iş akışına güvenmek istiyorsunuz .
ely

4
Bu göz önüne alındığında, pip'in bir uyarı yazdıran ancak yapabildiğini yükleyen bir tür zarif hata / isteğe bağlı atlama davranışını desteklememesi gerektiğini önermek çok sağır görünüyor. Bu, bir gereksinimler dosyasından tam olarak bu tür pip tabanlı kurulum için çok yaygın bir ihtiyaçtır.
ely

Yanıtlar:


230

Her satırı ile çalıştırmak pip installbir geçici çözüm olabilir.

cat requirements.txt | xargs -n 1 pip install

Not: -aparametre MacOS'ta mevcut değildir, bu nedenle yaşlı kedi daha taşınabilirdir.


21
mac için:cat requirements.txt | xargs -n 1 pip install
Walty Yeung

5
Yapmalıydım: cat requirements.txt | cut -f1 -d"#" | sed '/^\s*$/d' | xargs -n 1 pip installyorumlardaki herhangi bir şeyi kaldırmak ve boş satırlardan kurtulmak.
Narek

1
En azından GNU'da xargs, dosyadan argümanların okunmasına -aizin veren bayrak seçeneği vardır, bu xargsnedenle bu xargs -n 1 -a requirements.txt pip install. UUOC'yi ve aşırı su tesisatını önler
Sergiy Kolodyazhnyy

7
Windows için :)FOR /F %k in (requirements.txt) DO pip install %k
wcyn

-aBayrak olmasa bile , düşünün < requirements.txt xargs -n 1 pip installveya ön taraftaki yönlendirmeyi beğenmediyseniz xargs -n 1 pip install < requirements.txt,. :-)
torek

10

Bu çözüm, gereksinimler.txt dosyanızdaki boş satırları, boşluk satırlarını, # yorum satırlarını, boşluk-sonra- # yorum satırlarını işler.

cat requirements.txt | sed -e '/^\s*#.*$/d' -e '/^\s*$/d' | xargs -n 1 pip install

Sed büyüsü için bu cevaba şapka ucu .


1
Güzel çalışıyor. Kullandığım pip freezeyerine cat requirements.txt.
Vishal

5

Pencereler için:

pip sürümü> = 18

import sys
from pip._internal import main as pip_main

def install(package):
    pip_main(['install', package])

if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

pip sürümü <18

import sys
import pip

def install(package):
    pip.main(['install', package])

if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

'main' pip'in bir parçası değildir. Hata.
Pranzell

4

xargsEğer şartlar dosyasında yorum veya boş satırlar varsa çözüm çalışmaları hantal taşınabilirlik sorunları (BSD / GNU) ve / veya olabilir ama.

Böyle bir davranışın gerekli olduğu kullanım senaryosuna gelince, örneğin iki ayrı gereksinim dosyası kullanıyorum, biri yalnızca her zaman yüklenmesi gereken temel bağımlılıkları listeliyor ve vakaların% 90'ında çekirdek dışı bağımlılıkları olan başka bir dosya çoğu kullanım için gerekli değildir. Bu, Recommendsdebian paketinin bölümünün eşdeğeri olacaktır .

İsteğe bağlı bağımlılıklarısed yüklemek için aşağıdaki kabuk komut dosyasını (gerektirir ) kullanıyorum :

#!/bin/sh

while read dependency; do
    dependency_stripped="$(echo "${dependency}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
    # Skip comments
    if [[ $dependency_stripped == \#* ]]; then
        continue
    # Skip blank lines
    elif [ -z "$dependency_stripped" ]; then
        continue
    else
        if pip install "$dependency_stripped"; then
            echo "$dependency_stripped is installed"
        else
            echo "Could not install $dependency_stripped, skipping"
        fi
    fi
done < recommends.txt

0

Teşekkürler, Windows kasaları için Etienne Prothon.

Ancak, pip 18'e yükselttikten sonra, pip paketi main'i halka göstermez. Yani kodu bu şekilde değiştirmeniz gerekebilir.

 # This code install line by line a list of pip package 
 import sys
 from pip._internal import main as pip_main

 def install(package):
    pip_main(['install', package])

 if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

-1

Pencereler için:

import os
from pip.__main__ import _main as main

error_log = open('error_log.txt', 'w')

def install(package):
    try:
        main(['install'] + [str(package)])
    except Exception as e:
        error_log.write(str(e))

if __name__ == '__main__':
    f = open('requirements1.txt', 'r')
    for line in f:
        install(line)
    f.close()
    error_log.close()
  1. Yerel bir dizin oluşturun ve requirements.txtdosyanızı içine koyun.
  2. Yukarıdaki kodu kopyalayın ve aynı dizine bir python dosyası olarak kaydedin. .pyÖrneğin uzantı kullanmayı unutmayın ,install_packages.py
  3. Bu dosyayı bir cmd kullanarak çalıştırın: python install_packages.py
  4. Bahsedilen tüm paketler hiç durmadan tek seferde kurulacaktır. :)

Kurulum işlevine başka parametreler ekleyebilirsiniz. Sevmek: main(['install'] + [str(package)] + ['--update'])

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.