Anaconda cập nhật tất cả các gói có thể?


149

Tôi đã thử conda search --outdated, có rất nhiều gói lỗi thời, ví dụ như scipy là 0.17.1 nhưng mới nhất là 0.18.0. Tuy nhiên, khi tôi làm conda update --all. Nó sẽ không cập nhật bất kỳ gói.

cập nhật 1

conda update --all --alt-hint

Fetching package metadata .......
Solving package specifications: ..........

# All requested packages already installed.
# packages in environment at /home/user/opt/anaconda2:
#

cập nhật 2

Tôi có thể cập nhật các gói riêng biệt. Tôi có thể làm conda update scipy. Nhưng tại sao tôi không thể cập nhật tất cả chúng trong một lần?


2
Nó có thể là do scipy mới nhất có một sự phụ thuộc mâu thuẫn. Chẳng hạn, nó có thể yêu cầu NumPy 1.11, nhưng bạn có một gói khác yêu cầu NumPy 1.10. Bạn có thể thử conda update --all --alt-hintvà xem liệu nó có cho bất kỳ đầu ra nào không ... Hoặc chỉ cần thử conda update scipyvà xem điều gì sẽ xảy ra (có lẽ với --alt-hintcờ)
darthbith

@darthbith vui lòng tham khảo để cập nhật 1. Không có thông tin hữu ích.
Vương

1
But why I cannot update all of them in one go?Có lẽ bởi vì bạn có ít nhất một gói phụ thuộc vào phiên bản cũ hơn và do đó không có gì có thể được cập nhật.
cel

Có thể tìm ra cái nào phụ thuộc vào gói cũ?
Vương

3
Tôi khuyên bạn nên chạy conda update condatrướcconda update --all
gizzmole

Câu trả lời:


230

TL; DR: xung đột phụ thuộc: Cập nhật một yêu cầu (theo yêu cầu của nó) để hạ cấp khác

Bạn đúng rồi:

conda update --all

thực sự là con đường để đi 1 . Conda luôn cố gắng nâng cấp các gói lên phiên bản mới nhất trong sê-ri (giả sử Python 2.x hoặc 3.x).

Xung đột phụ thuộc

Nhưng có thể có những xung đột phụ thuộc (ngăn cản nâng cấp thêm). Conda thường cảnh báo rất rõ ràng nếu chúng xảy ra.

ví dụ: X yêu cầu Y <5.0, vì vậy Y sẽ không bao giờ> = 5.0

Đó là lý do tại sao bạn 'không thể' nâng cấp tất cả.

Giải quyết

Để thêm: có thể nó có thể hoạt động nhưng phiên bản X mới hơn hoạt động với Y> 5.0 không có sẵn trong conda. Có thể cài đặt với pip, vì nhiều gói có sẵn trong pip. Nhưng hãy lưu ý rằng pip cũng cài đặt các gói nếu xung đột phụ thuộc tồn tại và nó thường phá vỡ môi trường conda của bạn theo nghĩa là bạn không thể cài đặt đáng tin cậy với conda nữa. Nếu bạn làm điều đó, hãy làm điều đó như là phương sách cuối cùng và sau khi tất cả các gói đã được cài đặt với conda. Nó đúng hơn là một hack.

Một cách an toàn bạn có thể thử là thêm conda-forge dưới dạng kênh khi nâng cấp (thêm -c conda-forgedưới dạng cờ) hoặc bất kỳ kênh nào khác bạn thấy có chứa gói của mình nếu bạn thực sự cần phiên bản mới này . Cách này conda cũng tìm kiếm ở những nơi này cho các gói có sẵn.

Xem xét bản cập nhật của bạn : Bạn có thể nâng cấp từng cái một cách riêng biệt, nhưng làm như vậy sẽ không chỉ bao gồm nâng cấp mà còn hạ cấp gói khác. Nói, để thêm vào ví dụ trên:

X> 2.0 yêu cầu Y <5.0, X <2.0 yêu cầu Y> 5.0

Vì vậy, nâng cấp Y> 5.0 có nghĩa là hạ cấp X xuống <2.0 và ngược lại.

(tất nhiên đây là một ví dụ sư phạm, nhưng thực tế nó giống nhau, thường chỉ phụ thuộc phức tạp hơn và phụ thuộc phụ )

Vì vậy, bạn vẫn không thể nâng cấp tất cả chúng bằng cách thực hiện nâng cấp riêng; các phụ thuộc chỉ là không thỏa đáng nên sớm hay muộn, một bản nâng cấp sẽ hạ cấp lại gói đã được nâng cấp. Hoặc phá vỡ tính tương thích của các gói (mà bạn thường không muốn!), Điều này chỉ có thể bằng cách gọi một cách rõ ràng một phụ thuộc bỏ qualực lượng -command. Nhưng điều đó chỉ để là Hack theo cách của bạn xung quanh vấn đề này, chắc chắn không phải là trường hợp bình thường người dùng!


1 Nếu bạn thực sự muốn cập nhật các gói cài đặt mà bạn thường không cập nhật . Lệnh chạy trong môi trường cơ sở sẽ cập nhật các gói trong này, nhưng thông thường bạn nên làm việc với các môi trường ảo ( conda create -n myenvvà sau đó conda activate myenv). Thực thi conda update --allbên trong một môi trường như vậy sẽ cập nhật các gói bên trong môi trường này. Tuy nhiên, vì môi trường cơ sở cũng là một môi trường, câu trả lời áp dụng cho cả hai trường hợp theo cùng một cách.


1
Nếu bạn đang sử dụng conda, đừng phá vỡ môi trường của bạn khi bạn ghi đè bằng pip! Nếu bạn đang sử dụng môi trường Khoa học dữ liệu, đừng cài đặt pkgs bị cô lập bởi vì bạn có nhiều khả năng sau đó với pip để phá vỡ env của bạn.
InLaw

1
Tôi đồng ý, sử dụng pip làm cho conda không hoạt động đáng tin cậy nữa. Tôi đã thêm điều này vào câu trả lời một cách rõ ràng.
Mayou36

14

Để trả lời chính xác hơn cho câu hỏi:

conda (là conda cho miniconda như đối với Anaconda) cập nhật tất cả trừ CHỈ trong một phiên bản cụ thể của gói -> chính và phụ. Đó là mô thức.

Trong tài liệu bạn sẽ tìm thấy "LƯU Ý: Conda cập nhật lên phiên bản cao nhất trong sê-ri của nó, vì vậy Python 2.7 cập nhật lên mức cao nhất có sẵn trong loạt 2.x và 3.6 cập nhật lên mức cao nhất có sẵn trong loạt 3.x." tài liệu

Nếu Wang không đưa ra một ví dụ có thể tái tạo, người ta chỉ có thể hỗ trợ. ví dụ như đó thực sự là môi trường ảo mà anh ấy muốn cập nhật hay Wang có thể có được những gì anh ấy / cô ấy muốn

conda update -n ENVIRONMENT --all

* Vui lòng đọc tài liệu trước khi thực hiện "cập nhật --all"! Điều này không dẫn đến một bản cập nhật của tất cả các gói theo bản chất. Vì conda cố gắng giải quyết mối quan hệ phụ thuộc giữa tất cả các gói trong môi trường của bạn, điều này có thể dẫn đến các gói DOWNGRADED mà không có cảnh báo.


Nếu bạn chỉ muốn cập nhật gần như tất cả, bạn có thể tạo một tệp ghim

echo "conda ==4.0.0" >> ~/miniconda3/envs/py35/conda-meta/pinned
echo "numpy 1.7.*" >> ~/miniconda3/envs/py35/conda-meta/pinned

trước khi chạy cập nhật.

Nếu sau này bạn muốn bỏ qua tệp trong env của mình để cập nhật, bạn có thể làm:

conda update --all --no-pin

Bạn không nên cập nhật - tất cả. Nếu bạn cần nó tuy nhiên bạn là người tiết kiệm để kiểm tra điều này trong một môi trường nhân bản.

Bước đầu tiên phải luôn luôn là sao lưu thông số kỹ thuật hiện tại của bạn:

conda list -n py35 --explicit 

(nhưng ngay cả như vậy không phải lúc nào cũng có một liên kết đến nguồn có sẵn - như đối với các tiện ích mở rộng jupyterlab)

Tiếp theo bạn có thể sao chép và cập nhật:

conda create -n py356 --clone py35

conda activate py356
conda config --set pip_interop_enabled True # for conda>=4.6
conda update --all

cấu hình conda


cập nhật:

Bởi vì ý tưởng về conda là tốt nhưng nó không hoạt động tốt cho các môi trường phức tạp, cá nhân tôi thích sự kết hợp của nix-shell (or lorri) and poetry[như pip / conda cao cấp .-)] ( intro po2nix ).


Cuối cùng, nếu bạn thực sự cần phải làm việc với các gói không tương thích do phụ thuộc vào nó, có thể với các công nghệ như NixOS / nix-pkgs .


3
Câu trả lời này giả định: 1. bạn đã cài đặt miniconda3 với tên và đường dẫn mặc định (chứ không phải là anaconda) 2. rằng bạn đã tạo một môi trường "py35". Bạn có thể chỉ định rằng xa hơn là người mới bắt đầu, người mà câu trả lời này nên được nhắm mục tiêu (theo ý kiến ​​của tôi), có thể dễ bị nhầm lẫn. Hơn nữa, đường may của bạn không thực sự trả lời câu hỏi, vì điều này vẫn có thể không cho phép anh ta nâng cấp. Và đó là mục tiêu của anh ấy.
Mayou36

Tất nhiên, để tôi hỏi riêng họ: a) "CHỈ trong một phiên bản cụ thể": điều này đề cập đến phiên bản Python, không phải cho các gói, phải không? Hoặc bạn có thể trích dẫn điều này xin vui lòng?
Mayou36

b) "Trong tài liệu bạn sẽ tìm thấy [...]": điều này đề cập rõ ràng đến phiên bản Python. Nó không có gì để làm với câu hỏi, đúng không? Hoặc tại sao bạn đăng bài này? Tuyên bố này có liên quan như thế nào?
Mayou36

c) conda update -n ENVIRONMENT --all: Tôi đồng ý rằng đây là những gì anh ấy / cô ấy thường muốn sử dụng, không phải để cập nhật môi trường cơ sở. Tuy nhiên, tôi không tìm thấy lời giải thích trong câu trả lời của bạn về vấn đề này, nó chỉ được viết và không đề cập đến sự khác biệt của việc sử dụng lệnh của op trong môi trường cơ sở.
Mayou36

d) "Nếu bạn chỉ muốn cập nhật gần như tất cả, bạn có thể tạo tệp ghim": đây là một thông tin hay. Nhưng đó không phải là những gì OP yêu cầu. Anh ấy muốn biết tại sao anh ấy không thể cập nhật tất cả . Anh ấy không muốn xác định phiên bản. Vì vậy, nó không thêm vào câu trả lời, phải không?
Mayou36

2

Hãy tưởng tượng biểu đồ phụ thuộc của các gói, khi số lượng gói phát triển lớn, khả năng gặp phải xung đột khi nâng cấp / thêm gói cao hơn nhiều. Để tránh điều này, chỉ cần tạo một môi trường mới trong Anaconda.

Hãy tiết kiệm, chỉ cài đặt những gì bạn cần. Đối với tôi, tôi đã cài đặt các gói sau trong môi trường mới của mình:

  • gấu trúc
  • học hỏi
  • matplotlib
  • sổ tay
  • máy ảnh

Và tôi có tổng cộng 84 gói.


Điều này không trả lời câu hỏi về cách nâng cấp một gói cụ thể.
Mayou36

0

Nếu làm việc trong MS windows, bạn có thể sử dụng bộ điều hướng Anaconda. nhấp vào môi trường, trong hộp thả xuống, nó được "cài đặt" theo mặc định. Bạn có thể chọn "cập nhật" và bắt đầu từ đó


1
Nhưng làm thế nào để bạn chọn tất cả để cập nhật khi có quá nhiều để chọn riêng lẻ?
beldaz

@beldaz, tôi đã cố gắng 'giải quyết' nó bằng cách chọn tất cả 141 gói trong cột cuối cùng với 'Phiên bản', rồi nhấn Áp dụng. Không chắc chắn nếu nó hoạt động :(. Sau đó, tôi chỉ mở bảng điều khiển Anaconda bằng cách nhấn <win> Anaconda Prompt
Pieter21

Chạy với tư cách Quản trị viên cũng có thể được yêu cầu
Pieter21

Điều này cũng không giải quyết được vấn đề thực tế, hãy đọc câu trả lời được chấp nhận về xung đột phụ thuộc.
Mayou36

-1

Để cập nhật tất cả các gói có thể tôi đã sử dụng conda update --update-all

Nó hoạt động!


4
Không, nó "không": nếu bạn đọc lại OP, sẽ xảy ra xung đột phụ thuộc. Câu trả lời này không giải quyết cũng không giải thích bất cứ điều gì
Mayou36

-6

Tôi đã giải quyết vấn đề này với condapip.

Đầu tiên, tôi chạy:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Sau đó, tôi mở cmd và chạy mã này

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Cuối cùng, bạn nên cài đặt matplotlibtrong pip bằng mã nàypip install matplotlib


6
Điều này thậm chí không gần với những gì OP muốn làm
user8408080
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.