Ngăn chặn pip không thành công trên một gói khi cài đặt với tests.txt


138

Tôi đang cài đặt gói từ requirements.txt

pip install -r requirements.txt

Các requirements.txttập tin đọc:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxmllà gói duy nhất không cài đặt được và điều này dẫn đến mọi thứ đều thất bại (kết quả mong đợi được chỉ ra bởi các larsks trong các bình luận). Tuy nhiên, sau khi lxmlthất bại pipvẫn chạy qua và tải xuống các gói còn lại.

Theo những gì tôi hiểu thì pip install -r requirements.txtlệnh sẽ thất bại nếu bất kỳ gói nào được liệt kê trong phần requirements.txtcài đặt không thành công.

Có bất kỳ đối số nào tôi có thể vượt qua khi chạy pip install -r requirements.txtđể bảo nó cài đặt những gì có thể và bỏ qua các gói mà nó không thể hoặc thoát ra ngay khi thấy có lỗi không?


3
Xóa lxml khỏi yêu cầu của bạn
RickyA

1
Cảm ơn, điều đó sẽ làm việc trong trường hợp này, nhưng nói chung, có cách nào xung quanh điều này? Hoặc là bình thường chỉ để chạy lệnh, thấy rằng nó thất bại và sau đó cắt tỉa danh sách gói?
em

5
Nếu một gói được liệt kê trong requirements.txtđó có lẽ là bắt buộc , do đó, sẽ có nghĩa là pipsẽ thất bại nếu gói không thể được cài đặt. Nếu mã vẫn chạy mà không có gói đó thì đó không phải là một yêu cầu. Việc cắt tỉa ngẫu nhiên các gói không thành công requirements.txtdường như sẽ gây ra sự cố với các phụ thuộc bị thiếu.
larsks

1
@larsks có thể rất phổ biến khi có nhiều tệp request.txt cho một môi trường hoặc gói phát triển duy nhất. Ví dụ, có thể có đầy đủ một công cụ tùy chọn có thể được sử dụng để cải thiện môi trường kiểm tra đơn vị / tích hợp hoặc cấu hình hiệu suất, nhưng không bắt buộc. Bạn vẫn muốn kiểm soát phiên bản một tệp nguồn duy nhất thể hiện các gói này và mọi phiên bản được ghim và dựa vào cùng một pip install -r <some file>quy trình để chuẩn hóa việc tạo môi trường phù hợp.
ely

4
Vì điều này, có vẻ như rất khiếm thính khi đề xuất pip không nên hỗ trợ một số loại thất bại duyên dáng / hành vi bỏ qua tùy chọn in cảnh báo nhưng cài đặt những gì có thể. Đó là một nhu cầu rất phổ biến đối với chính xác loại cài đặt dựa trên pip này từ tệp yêu cầu.
ely

Câu trả lời:


229

Chạy từng dòng với pip installcó thể là một cách giải quyết.

cat requirements.txt | xargs -n 1 pip install

Lưu ý: -atham số không khả dụng trong MacOS, vì vậy mèo cũ dễ mang theo hơn.


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

5
Tôi đã phải làm: cat requirements.txt | cut -f1 -d"#" | sed '/^\s*$/d' | xargs -n 1 pip installđể loại bỏ bất cứ điều gì trong các ý kiến ​​và loại bỏ các dòng trống.
Narek

1
Ít nhất là với GNU xargs, có -atùy chọn cờ, cho phép xargsđọc các đối số từ tệp, vì vậy điều này có thể được thực hiện dưới dạng xargs -n 1 -a requirements.txt pip install. Ngăn chặn UUOC và hệ thống ống nước quá mức
Sergiy Kolodyazhnyy

7
Dành cho cửa sổ :)FOR /F %k in (requirements.txt) DO pip install %k
wcyn

Ngay cả khi không có -acờ, hãy cân nhắc < requirements.txt xargs -n 1 pip installhoặc nếu bạn không thích chuyển hướng ở phía trước , xargs -n 1 pip install < requirements.txt. :-)

10

Giải pháp này xử lý các dòng trống, dòng trắng, # dòng nhận xét, dòng nhận xét khoảng trắng-sau đó- # trong tệp yêu cầu của bạn.

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

Hat tip cho câu trả lời này cho phép thuật sed.


1
Hoạt động độc đáo. Tôi đã sử dụng pip freezethay vì cat requirements.txt.
Vishal

5

Cho cửa sổ:

phiên bản 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)

phiên bản 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)

'chính' không phải là một phần của pip. Lỗi.
Pranzell

4

Các xargstác phẩm giải pháp nhưng có thể có vấn đề di (BSD / GNU) và / hoặc được rườm rà nếu bạn có ý kiến hoặc dòng trống trong tập tin yêu cầu của bạn.

Đối với usecase, nơi yêu cầu một hành vi như vậy, tôi sử dụng ví dụ hai tệp yêu cầu riêng biệt, một tệp chỉ liệt kê các phụ thuộc lõi cần phải luôn được cài đặt và một tệp khác có phụ thuộc không phải là lõi trong 90% trường hợp không cần thiết cho hầu hết các giai đoạn. Đó sẽ là một phần tương đương với Recommendsphần của gói debian.

Tôi sử dụng tập lệnh shell sau (yêu cầu sed) để cài đặt các phụ thuộc tùy chọn :

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

Cảm ơn, Etienne Prothon cho các trường hợp cửa sổ.

Nhưng, sau khi nâng cấp lên pip 18, gói pip không lộ chính ra công chúng. Vì vậy, bạn có thể cần phải thay đổi mã như thế này.

 # 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

Cho cửa sổ:

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. Tạo một thư mục cục bộ và đặt requirements.txttệp của bạn vào đó.
  2. Sao chép mã ở trên và lưu nó dưới dạng tệp python trong cùng thư mục. Hãy nhớ sử dụng .pyphần mở rộng, ví dụ,install_packages.py
  3. Chạy tệp này bằng cmd: python install_packages.py
  4. Tất cả các gói được đề cập sẽ được cài đặt trong một lần mà không dừng lại ở tất cả. :)

Bạn có thể thêm các tham số khác trong chức năng cài đặt. Giống: main(['install'] + [str(package)] + ['--update'])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.