Chỉ cài đặt các gói có sẵn bằng cách sử dụng “conda install --yes --file request.txt” mà không gặp lỗi


95

Trong khi cài đặt gói trong tệp tests.txt bằng Conda thông qua lệnh sau

conda install --yes --file requirements.txt

Nếu một gói trong tệp tests.txt không có sẵn, thì nó sẽ đưa ra thông báo "Không có lỗi gói" như hiển thị bên dưới:

Sử dụng trang web Anaconda Cloud api https://api.anaconda.org

Tìm nạp siêu dữ liệu gói: ....

Lỗi: Không tìm thấy gói nào trong các kênh linux-64 hiện tại khớp với: nimfa == 1.2.3

Bạn có thể tìm kiếm gói này trên anaconda.org với

anaconda search -t conda nimfa ==1.2.3

Thay vì đưa ra một lỗi, liệu có thể thay đổi hành vi này để nó cài đặt tất cả các gói có sẵn trong tệp tests.txt và đưa ra cảnh báo cho những gói không có sẵn không?

Tôi muốn điều này bởi vì, gói nimfa báo lỗi là không khả dụng, có thể được cài đặt pip. Vì vậy, nếu tôi có thể thay đổi hành vi conda install --yes --file requirements.txtchỉ đưa ra cảnh báo cho các gói không khả dụng, tôi có thể theo dõi nó bằng lệnh pip install -r requirments.txttrong .travis.yml để TravisCI cố gắng cài đặt nó từ một trong hai nơi có sẵn.

Câu trả lời:


169

Tôi đã kết thúc chỉ lặp lại các dòng của tệp

$ while read requirement; do conda install --yes $requirement; done < requirements.txt

Chỉnh sửa : Nếu bạn muốn cài đặt một gói bằng pip nếu nó không có sẵn thông qua conda, hãy thử:

$ while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt

Chỉnh sửa : Nếu bạn đang sử dụng Windows (tín dụng được chuyển đến @Clay ):

$ FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f"


5
Cảm ơn cho điều này, gợi ý nhỏ cho bất cứ ai sử dụng nó, hãy chắc chắn requirements.txt của bạn kết thúc với một dòng mới, do đó gói cuối cùng được đọc trong
Marawan Okasha

1
Có cách nào để tự động pip installcác gói không có sẵn bằng cách sử dụng conda install, trong khi lặp lại không?
PeterB

2
@delusionX, tôi đã mở rộng câu trả lời.
Cho đến khi Hoffmann vào

11
Giải pháp của @TillHoffmann trên máy Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" Hoạt động rất tốt. Cảm ơn!
Clay

3
Nếu bạn nhận xét trong tệp yêu cầu, pip sẽ phàn nàn một cách dài dòng (gây khó chịu nếu vô hại). Một biến thể của bash one-liner bỏ qua các nhận xét:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko


1

Đối với những người đang tìm kiếm, tôi đã sử dụng điều này làm giải pháp của @TillHoffmann cho vỏ cá:

$ while read requirement; conda install --yes $requirement; end < requirements.txt

$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt

1

Câu trả lời của Pbms ở đây là cách đúng đắn để làm điều đó, giả sử bạn có một môi trường hiện có để sao chép. Conda hoàn toàn có khả năng cài đặt cả gói Conda và gói pip, như được liệt kê trong environment.yml. Tôi muốn ghi lại toàn bộ quá trình một cách chi tiết hơn. Lưu ý rằng tôi đang sử dụng môi trường dựa trên thư mục, đó là lý do tại sao tôi đã thêm --prefix [path to environment folder]vào hầu hết các lệnh.

Giả sử bạn đã cài đặt một môi trường cho một dự án hiện có vào một thư mục được gọi envtrong thư mục hiện tại, như sau:

conda create --prefix ./env

Bạn sẽ tạo environment.ymlcho môi trường của dự án đó như thế này:

conda env export --prefix ./env > environment.yml

Bạn sẽ tạo một môi trường mới trong một số thư mục khác bằng cách sao chép environment.ymlvào đó và sau đó chạy nó từ đó:

conda env create --prefix ./env --file environment.yml

Bạn sẽ có được một môi trường đã tồn tại để khớp environment.ymlbằng cách sao chép lại environment.ymlvào đó một lần nữa và sau đó chạy nó từ đó:

conda env update --prefix ./env --file environment.yml --prune

Với môi trường được đề cập đang hoạt động, bạn sẽ xác minh trạng thái của các gói của nó như sau:

conda list

Đây là phiên bản rút gọn của những gì lệnh đó có thể in (lưu ý rằng các gói pip được đánh dấu pypi):

# Name                    Version                   Build  Channel
pip                       19.2.2                   py37_0
python                    3.7.4                h5263a28_0
numpy                     1.16.4           py37h19fb1c0_0
pandas                    0.25.1           py37ha925a31_0
pyodbc                    4.0.27           py37ha925a31_0
ibm-db                    3.0.1                    pypi_0    pypi
ibm-db-sa                 0.3.5                    pypi_0    pypi

Cuối cùng, đây là một phiên bản rút gọn của những gì environment.ymlcó thể trông như thế nào (lưu ý rằng các gói pip được liệt kê trong danh mục riêng của chúng):

dependencies:
  - pip=19.2.2=py37_0
  - python=3.7.4=h5263a28_0
  - numpy=1.16.4=py37h19fb1c0_0
  - pandas=0.25.1=py37ha925a31_0
  - pyodbc=4.0.27=py37ha925a31_0
  - pip:
    - ibm-db==3.0.1
    - ibm-db-sa==0.3.5

Lưu ý rằng việc sử dụng Conda và pip cùng nhau có thể gây ra một số chứng ợ nóng vì chúng có thể vô tình làm mất đi sự phụ thuộc của nhau. Bạn phải cài đặt tất cả các gói Conda của mình trước và sau đó là tất cả các gói pip sau đó, thay vì xen kẽ giữa hai gói. Nếu môi trường của bạn bị hỏng, khuyến nghị chính thức là xóa và tạo lại nó (từ environment.ymltệp của bạn ). Để biết thêm chi tiết, hãy xem hướng dẫn này:

https://www.anaconda.com/using-pip-in-a-conda-enosystem/

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.