หยุด pip ไม่ให้ล้มเหลวในแพ็กเกจเดียวเมื่อติดตั้งด้วย requirements.txt


151

ฉันกำลังติดตั้งแพ็คเกจจาก requirements.txt

pip install -r requirements.txt

requirements.txtไฟล์อ่าน:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxmlเป็นแพ็คเกจเดียวที่ไม่สามารถติดตั้งได้และทำให้ทุกอย่างล้มเหลว (ผลลัพธ์ที่คาดไว้ตามที่ระบุโดย larsks ในความคิดเห็น) อย่างไรก็ตามหลังจากความlxmlล้มเหลวpipยังคงดำเนินต่อไปและดาวน์โหลดส่วนที่เหลือของแพ็คเกจ

จากสิ่งที่ฉันเข้าใจpip install -r requirements.txtคำสั่งจะล้มเหลวหากแพ็คเกจใด ๆ ที่อยู่ในรายการrequirements.txtล้มเหลวในการติดตั้ง

มีข้อโต้แย้งใดบ้างที่ฉันสามารถส่งผ่านเมื่อเรียกใช้pip install -r requirements.txtเพื่อบอกให้ติดตั้งสิ่งที่สามารถทำได้และข้ามแพ็กเกจที่ไม่สามารถทำได้หรือออกทันทีที่เห็นว่ามีบางอย่างล้มเหลว


3
ลบ lxml ออกจากความต้องการของคุณ
txt

1
ขอบคุณที่จะได้ผลในกรณีนี้ แต่โดยทั่วไปแล้วมีวิธีแก้ไขปัญหานี้ไหม หรือปกติแค่รันคำสั่งดูว่ามันล้มเหลวแล้วตัดรายการแพ็คเกจ?
emh

5
หากมีการระบุแพ็กเกจไว้ในแพ็กเกจrequirements.txtนั้นเป็นสิ่งจำเป็นดังนั้นจึงสมเหตุสมผลที่pipจะล้มเหลวหากไม่สามารถติดตั้งแพ็กเกจได้ หากรหัสทำงานต่อไปโดยไม่มีแพ็คเกจนั้นก็แทบจะไม่จำเป็น การตัดแพ็กเกจที่ล้มเหลวแบบสุ่มrequirements.txtดูเหมือนว่าจะทำให้เกิดปัญหากับการอ้างอิงที่ขาดหายไป
larsks

1
@larsks อาจเป็นเรื่องปกติมากที่จะมีไฟล์ Requirement.txt หลายไฟล์สำหรับสภาพแวดล้อมการพัฒนาหรือแพ็คเกจเดียว ตัวอย่างเช่นอาจมีเครื่องมือเสริมที่สามารถใช้เพื่อปรับปรุงสภาพแวดล้อมการทดสอบหน่วย / การรวมหรือการทำโปรไฟล์ประสิทธิภาพ แต่ไม่จำเป็นต้องใช้อย่างเคร่งครัด คุณยังคงต้องการควบคุมเวอร์ชันไฟล์ต้นฉบับเดียวที่แสดงแพ็กเกจเหล่านี้และเวอร์ชันที่ตรึงไว้และใช้pip install -r <some file>เวิร์กโฟลว์เดียวกันเพื่อสร้างมาตรฐานการสร้างสภาพแวดล้อมที่เหมาะสม
ely

4
ด้วยเหตุนี้จึงดูเหมือนคนหูหนวกมากที่จะแนะนำว่า pip ไม่ควรสนับสนุนพฤติกรรมการข้ามความล้มเหลว / ทางเลือกบางประเภทที่พิมพ์คำเตือน แต่ติดตั้งสิ่งที่ทำได้ นั่นเป็นความต้องการที่พบบ่อยมากสำหรับการติดตั้งโดยใช้ pip ประเภทนี้จากไฟล์ข้อกำหนด
ely

คำตอบ:


246

การรันแต่ละบรรทัดด้วยpip installอาจเป็นวิธีแก้ปัญหาชั่วคราว

cat requirements.txt | xargs -n 1 pip install

หมายเหตุ: ไม่มี-aพารามิเตอร์ใน MacOS ดังนั้นแมวตัวเก่าจึงพกพาได้มากกว่า


21
สำหรับ mac:cat requirements.txt | xargs -n 1 pip install
Walty Yeung

5
ฉันต้องทำ: cat requirements.txt | cut -f1 -d"#" | sed '/^\s*$/d' | xargs -n 1 pip installเพื่อลบอะไรก็ได้ในความคิดเห็นและกำจัดบรรทัดว่าง
Narek

1
อย่างน้อยด้วย GNU xargsมี-aตัวเลือกแฟล็กซึ่งอนุญาตให้xargsอ่านอาร์กิวเมนต์จากไฟล์ดังนั้นจึงสามารถทำได้ในรูปแบบxargs -n 1 -a requirements.txt pip install. ป้องกันUUOCและท่อประปามากเกินไป
Sergiy Kolodyazhnyy

8
สำหรับ windows :)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

โซลูชันนี้จัดการบรรทัดว่างเส้นช่องว่าง # บรรทัดความคิดเห็นช่องว่าง - แล้ว - # บรรทัดความคิดเห็นในความต้องการของคุณ txt

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

เคล็ดลับหมวกสำหรับคำตอบนี้สำหรับความมหัศจรรย์


1
ทำงานได้ดี ฉันใช้pip freezeแทนcat requirements.txt.
Vishal

5

สำหรับ Windows:

เวอร์ชัน pip> = 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 เวอร์ชัน <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 ข้อผิดพลาด
Pranzell

4

xargsแต่ผลงานการแก้ปัญหาจะมีปัญหาในการพกพา (BSD / GNU) และ / หรือจะยุ่งยากถ้าคุณมีความคิดเห็นหรือบรรทัดว่างในไฟล์ความต้องการของคุณ

สำหรับกรณีการใช้งานที่จำเป็นต้องมีพฤติกรรมดังกล่าวฉันใช้ตัวอย่างเช่นไฟล์ข้อกำหนดสองไฟล์ที่แยกจากกันไฟล์หนึ่งซึ่งแสดงเฉพาะการอ้างอิงหลักที่ต้องติดตั้งเสมอและอีกไฟล์หนึ่งที่มีการอ้างอิงที่ไม่ใช่คอร์ซึ่งอยู่ใน 90% ของกรณี ไม่จำเป็นสำหรับผู้ใช้ส่วนใหญ่ นั่นจะเทียบเท่ากับ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

ขอบคุณ Etienne Proton สำหรับเคส windows

แต่หลังจากอัปเกรดเป็น pip 18 แพ็กเกจ pip จะไม่เปิดเผยข้อมูลหลักสู่สาธารณะ ดังนั้นคุณอาจต้องเปลี่ยนรหัสเช่นนี้

 # 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

สำหรับ Windows:

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. คัดลอกโค้ดด้านบนและบันทึกเป็นไฟล์ python ในไดเร็กทอรีเดียวกัน อย่าลืมใช้.pyส่วนขยายตัวอย่างเช่นinstall_packages.py
  3. เรียกใช้ไฟล์นี้โดยใช้ cmd: python install_packages.py
  4. แพ็คเกจทั้งหมดที่กล่าวถึงจะได้รับการติดตั้งในครั้งเดียวโดยไม่หยุดเลย :)

คุณสามารถเพิ่มพารามิเตอร์อื่น ๆ ในฟังก์ชันการติดตั้ง ชอบ: main(['install'] + [str(package)] + ['--update'])

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