आवश्यकताओं के साथ स्थापित करते समय सिंगल पैकेज पर फेल होने से रोकें


138

से पैकेज स्थापित कर रहा हूं requirements.txt

pip install -r requirements.txt

requirements.txtफ़ाइल में लिखा है:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxmlस्थापित करने में विफल एकमात्र पैकेज है और इससे सब कुछ विफल हो जाता है (अपेक्षित परिणाम जैसा कि टिप्पणियों में लार्क्स द्वारा बताया गया है)। हालाँकि, के बाद lxmlविफल रहता है pipअभी भी के माध्यम से चलाता है और बाकी संकुल को डाउनलोड करता है।

pip install -r requirements.txtअगर मैं समझता हूं कि कमांड विफल हो जाएगा, तो यदि कोई भी पैकेज requirements.txtस्थापित करने में विफल रहता है।

क्या ऐसा कोई तर्क है जो मैं इसे चलाने के pip install -r requirements.txtलिए यह बता सकता हूं कि यह क्या स्थापित कर सकता है और संकुल को छोड़ सकता है जो इसे छोड़ नहीं सकता, या जैसे ही यह विफल होता है, बाहर निकलने के लिए?


3
अपने requirements.txt से lxml निकालें
RickyA

1
धन्यवाद, जो इस मामले में काम करेगा, लेकिन सामान्य तौर पर, क्या इसके आसपास कोई रास्ता है? या यह केवल कमांड चलाने के लिए सामान्य है, देखें कि यह विफल हो जाता है और फिर पैकेज सूची को prune करता है?
एमएच

5
यदि कोई पैकेज requirements.txtइसमें सूचीबद्ध है , तो संभवतः इसकी आवश्यकता है , इसलिए यह समझ में आता है कि pipयदि पैकेज स्थापित नहीं किया जा सकता है तो वह विफल हो जाएगा। यदि कोड उस पैकेज के बिना वैसे भी चलता है, तो यह शायद ही एक आवश्यकता थी। रैंडमली प्रूनिंग फेल हुए पैकेजों से requirements.txtऐसा लगता है कि यह सिर्फ लापता निर्भरता के साथ समस्या पैदा करने वाला है।
लार्क्स

1
@ लार्क्स एकल विकास वातावरण या पैकेज के लिए कई आवश्यकताएं होना चाहिए। उदाहरण के लिए, एक वैकल्पिक उपकरण से भरा हो सकता है जिसका उपयोग इकाई / एकीकरण परीक्षण वातावरण या प्रदर्शन रूपरेखा को बढ़ाने के लिए किया जा सकता है, लेकिन जिसकी कड़ाई से आवश्यकता नहीं है। आप अभी भी इन पैकेजों और किसी भी पिन किए गए संस्करणों को व्यक्त करते हुए एकल स्रोत फ़ाइल को नियंत्रित करना चाहते हैं, और pip install -r <some file>उचित वातावरण के निर्माण को मानकीकृत करने के लिए समान वर्कफ़्लो पर भरोसा करते हैं।
ely

4
इसे देखते हुए, यह सुझाव देने के लिए बहुत टोन बहरा लगता है कि पाइप को कुछ प्रकार की सुशोभित विफलता / वैकल्पिक लंघन व्यवहार का समर्थन नहीं करना चाहिए जो एक चेतावनी प्रिंट करता है, लेकिन इसे स्थापित कर सकता है। आवश्यकताओं फ़ाइल से इस प्रकार के पाइप-आधारित स्थापना के लिए यह एक बहुत ही सामान्य आवश्यकता है।
ely

जवाबों:


230

प्रत्येक पंक्ति को चलाना pip installएक समाधान हो सकता है।

cat requirements.txt | xargs -n 1 pip install

नोट: -aपैरामीटर MacOS के तहत उपलब्ध नहीं है, इसलिए पुरानी बिल्ली अधिक पोर्टेबल है।


21
मैक के लिए:cat requirements.txt | xargs -n 1 pip install
वाल्टी येओंग

5
मुझे करना था: cat requirements.txt | cut -f1 -d"#" | sed '/^\s*$/d' | xargs -n 1 pip installटिप्पणियों में कुछ भी निकालने और खाली लाइनों से छुटकारा पाने के लिए।
नारेक

1
कम से कम जीएनयू के साथ xargs, वहाँ -aझंडा विकल्प है, जो xargsफ़ाइल से तर्क पढ़ने की अनुमति देता है , इसलिए इसे इस प्रकार किया जा सकता है xargs -n 1 -a requirements.txt pip installUUOC को रोकता है और अत्यधिक प्लंबिंग
Sergiy Kolodyazhnyy

7
खिड़कियों के लिए :)FOR /F %k in (requirements.txt) DO pip install %k
wcyn

यहां तक ​​कि -aझंडे के बिना , विचार करें < requirements.txt xargs -n 1 pip install, या यदि आप मोर्चे पर रीडायरेक्ट पसंद नहीं करते हैं, तो xargs -n 1 pip install < requirements.txt। :-)
torek

10

यह समाधान आपकी आवश्यकताओं में रिक्त लाइनों, व्हाट्सएप लाइनों, # टिप्पणी लाइनों, व्हॉट्सएप-फिर- # टिप्पणी लाइनों को संभालता है।

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

हैट मैजिक के इस जवाब के लिए हैट टिप ।


1
अच्छी तरह से काम करता है। मैं के pip freezeबजाय इस्तेमाल किया cat requirements.txt
विशाल

5

विंडोज के लिए:

पाइप संस्करण> = 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)

पाइप संस्करण <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)

'मुख्य' पाइप का हिस्सा नहीं है। त्रुटि।
प्रांजल

4

xargsअगर आप अपनी आवश्यकताओं को फ़ाइल में टिप्पणी या रिक्त लाइनों है समाधान काम करता है लेकिन पोर्टेबिलिटी मुद्दों (BSD / जीएनयू) हो सकता है और / या होना बोझिल।

Usecase के लिए जहां इस तरह के व्यवहार की आवश्यकता होगी, मैं उदाहरण के लिए दो अलग-अलग आवश्यकता फ़ाइलों का उपयोग करता हूं, एक जो केवल कोर निर्भरता को सूचीबद्ध करता है जिसे हमेशा स्थापित करने की आवश्यकता होती है और एक अन्य फाइल गैर-कोर निर्भरता के साथ होती है जो 90% मामलों में होती है। सबसे usecases के लिए आवश्यक नहीं है। यह Recommendsएक डेबियन पैकेज के अनुभाग के बराबर होगा ।

मैं वैकल्पिक निर्भरताएँsed स्थापित करने के लिए निम्न शेल स्क्रिप्ट (आवश्यकता ) का उपयोग करता हूँ :

#!/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

धन्यवाद, विंडोज़ मामलों के लिए एटीन प्रोटॉन।

लेकिन, 18 पाइप में अपग्रेड करने के बाद, पाइप पैकेज मुख्य रूप से सार्वजनिक रूप से उजागर नहीं होता है। तो आपको इस तरह कोड बदलने की आवश्यकता हो सकती है।

 # 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

विंडोज के लिए:

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. एक स्थानीय निर्देशिका बनाएं, और उसमें अपनी requirements.txtफ़ाइल डालें ।
  2. ऊपर दिए गए कोड को कॉपी करें और इसे उसी निर्देशिका में एक अजगर फ़ाइल के रूप में सहेजें। .pyउदाहरण के लिए, एक्सटेंशन का उपयोग करना याद रखें ,install_packages.py
  3. इस फ़ाइल को cmd का उपयोग करके चलाएं: python install_packages.py
  4. उल्लिखित सभी संकुल एक ही बार में बिना रुके स्थापित हो जाएंगे। :)

आप स्थापित फ़ंक्शन में अन्य पैरामीटर जोड़ सकते हैं। पसंद: main(['install'] + [str(package)] + ['--update'])

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.