anaconda memperbarui semua paket yang mungkin?

151

Saya mencoba conda search --outdated, ada banyak paket yang ketinggalan zaman, misalnya scipy adalah 0.17.1 tetapi yang terbaru adalah 0.18.0. Namun, ketika saya melakukan itu conda update --all. Itu tidak akan memperbarui paket apa pun.

perbarui 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:
#

pembaruan 2

Saya dapat memperbarui paket-paket itu secara terpisah. Saya bisa melakukannya conda update scipy. Tetapi mengapa saya tidak dapat memperbarui semuanya sekaligus?

Wang
sumber
2
Mungkin karena scipy terbaru memiliki ketergantungan yang saling bertentangan. Misalnya, mungkin memerlukan NumPy 1.11, tetapi Anda memiliki paket berbeda yang membutuhkan NumPy 1.10. Anda dapat mencoba conda update --all --alt-hintdan melihat apakah itu memberikan hasil ... Atau coba saja conda update scipydan lihat apa yang terjadi (mungkin dengan --alt-hintbendera)
darthbith
@darthbith lihat pembaruan 1. Tidak ada info berguna.
Wang
1
But why I cannot update all of them in one go?Mungkin karena Anda memiliki setidaknya satu paket yang tergantung pada versi yang lebih lama sehingga tidak ada yang dapat diperbarui.
sel
Apakah mungkin untuk mengetahui mana yang tergantung pada paket lama?
Wang
3
Saya sarankan berlari conda update condasebelumconda update --all
gizzmole

Jawaban:

230

TL; DR: konflik ketergantungan: Memperbarui satu memerlukan (dengan persyaratan itu) untuk menurunkan versi yang lain

Kamu benar:

conda update --all

sebenarnya cara untuk pergi 1 . Conda selalu mencoba untuk memutakhirkan paket ke versi terbaru dalam seri (katakanlah Python 2.x atau 3.x).

Konflik ketergantungan

Tetapi ada kemungkinan bahwa ada konflik ketergantungan (yang mencegah peningkatan lebih lanjut). Conda biasanya memperingatkan dengan sangat eksplisit jika itu terjadi.

misal X membutuhkan Y <5.0, jadi Y tidak akan pernah> = 5.0

Itu sebabnya Anda 'tidak bisa' memutakhirkan semuanya.

Menyelesaikan

Untuk menambahkan: mungkin ini bisa berfungsi tetapi versi X yang lebih baru yang bekerja dengan Y> 5.0 tidak tersedia di conda. Dimungkinkan untuk menginstal dengan pip, karena lebih banyak paket tersedia di pip. Namun ketahuilah bahwa pip juga menginstal paket jika ada konflik dependensi dan itu biasanya merusak lingkungan conda Anda dalam arti bahwa Anda tidak dapat menginstal dengan andal lagi dengan conda. Jika Anda melakukannya, lakukan itu sebagai pilihan terakhir dan setelah semua paket diinstal dengan conda. Ini agak hack.

Cara aman yang dapat Anda coba adalah menambahkan conda-forge sebagai saluran ketika meningkatkan (menambahkan -c conda-forgesebagai bendera) atau saluran lain yang Anda temukan yang berisi paket Anda jika Anda benar-benar membutuhkan versi baru ini . Dengan cara ini, conda juga mencari paket yang tersedia di tempat ini.

Mempertimbangkan pembaruan Anda: Anda dapat memutakhirkannya secara terpisah, tetapi dengan melakukan hal itu tidak hanya akan menyertakan peningkatan, tetapi juga penurunan versi paket lain. Katakan, untuk menambahkan contoh di atas:

X> 2.0 membutuhkan Y <5.0, X <2.0 membutuhkan Y> 5.0

Jadi memutakhirkan Y> 5.0 menyiratkan penurunan X ke <2.0 dan sebaliknya.

( ini adalah contoh pedagogis, tentu saja, tetapi kenyataannya sama, biasanya hanya dengan dependensi dan sub-dependensi yang lebih rumit )

Jadi Anda masih tidak dapat memutakhirkan semuanya dengan melakukan peningkatan secara terpisah; dependensinya tidak memuaskan, jadi sebelumnya atau nanti, pembaruan akan menurunkan versi paket yang sudah ditingkatkan lagi. Atau hancurkan kompatibilitas paket-paket (yang biasanya tidak Anda inginkan!), Yang hanya mungkin dilakukan dengan secara eksplisit menjalankan diabaikan-dependensi dan paksa- perintah. Tapi itu hanya untuk meretas jalan keluar masalah Anda, jelas bukan kasus pengguna biasa!


1 Jika Anda benar-benar ingin memperbarui paket instalasi Anda, yang biasanya tidak Anda lakukan . Perintah yang dijalankan di lingkungan dasar akan memperbarui paket dalam hal ini, tetapi biasanya Anda harus bekerja dengan lingkungan virtual ( conda create -n myenvdan kemudian conda activate myenv). Menjalankan conda update --alldi dalam lingkungan seperti itu akan memperbarui paket di dalam lingkungan ini. Namun, karena lingkungan basis juga merupakan lingkungan, jawabannya berlaku untuk kedua kasus dengan cara yang sama.

Mayou36
sumber
1
Jika Anda menggunakan conda, jangan merusak lingkungan Anda ketika Anda menimpa dengan pip! Jika menggunakan lingkungan Ilmu Data JANGAN menginstal pkgs terisolasi karena Anda lebih mungkin maka dengan pip untuk memecahkan env Anda.
InLaw
1
Saya setuju, menggunakan pip membuat conda tidak berfungsi lagi dengan andal. Saya telah menambahkan ini ke dalam jawaban secara eksplisit.
Mayou36
15

Untuk lebih tepatnya menjawab pertanyaan:

conda (yang merupakan conda untuk miniconda untuk Anaconda) memperbarui semua kecuali HANYA dalam versi spesifik paket -> major dan minor. Itulah paradigmanya.

Dalam dokumentasi Anda akan menemukan "CATATAN: Conda memperbarui ke versi tertinggi dalam seri, jadi Python 2.7 memperbarui ke tertinggi yang tersedia di seri 2.x dan 3.6 pembaruan ke tertinggi yang tersedia di seri 3.x." dokter

Jika Wang tidak memberikan contoh yang dapat direproduksi, orang hanya bisa membantu. mis. apakah itu benar-benar lingkungan virtual yang dia ingin perbarui atau dapatkah Wang mendapatkan apa yang dia inginkan

conda update -n ENVIRONMENT --all

* TOLONG baca dokumen sebelum menjalankan "update --all"! Ini tidak mengarah pada pembaruan semua paket secara alami. Karena conda mencoba untuk menyelesaikan hubungan ketergantungan antara semua paket di lingkungan Anda, ini dapat menyebabkan paket DIPERBARUI tanpa peringatan.


Jika Anda hanya ingin memperbarui hampir semua, Anda dapat membuat file pin

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

sebelum menjalankan pembaruan.

Jika nanti Anda ingin mengabaikan file di env Anda untuk pembaruan, Anda dapat melakukan:

conda update --all --no-pin

Anda seharusnya tidak melakukan pembaruan --semua. Namun jika Anda membutuhkannya, Anda lebih aman untuk menguji ini di lingkungan yang dikloning.

Langkah pertama harus selalu menjadi cadangan spesifikasi Anda saat ini:

conda list -n py35 --explicit 

(tetapi meskipun demikian tidak selalu ada tautan ke sumber yang tersedia - seperti untuk ekstensi jupyterlab)

Selanjutnya Anda dapat mengkloning dan memperbarui:

conda create -n py356 --clone py35

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

konfigurasi conda


memperbarui:

Karena ide conda bagus tetapi tidak bekerja dengan baik untuk lingkungan yang kompleks, saya pribadi lebih suka kombinasi nix-shell (or lorri) and poetry[sebagai pip / conda superior .-)] ( intro poetry2nix ).


Terakhir, jika Anda benar-benar perlu bekerja dengan paket yang tidak kompatibel karena ketergantungannya, dimungkinkan dengan teknologi seperti NixOS / nix-pkgs .

Dalam hukum
sumber
3
Jawaban ini mengasumsikan: 1. Anda menginstal miniconda3 dengan nama dan jalur default (dan tidak, katakan anaconda) 2. bahwa Anda membuat lingkungan "py35". Anda dapat menentukan lebih lanjut sebagai pemula, yang harus ditargetkan oleh jawaban ini (menurut saya), dapat dengan mudah bingung. Selain itu Anda tidak benar-benar menjawab pertanyaan, karena ini mungkin masih tidak memungkinkannya untuk memperbarui. Dan itu adalah tujuannya.
Mayou36
Tentu saja, izinkan saya bertanya kepada mereka secara individu: a) "HANYA dalam versi tertentu": ini mengacu pada versi Python, bukan ke paket, kan? Atau bisakah Anda mengutip ini?
Mayou36
b) "Dalam dokumentasi Anda akan menemukan [...]": ini merujuk dengan jelas ke versi Python. Itu tidak ada hubungannya dengan pertanyaan, benar? Atau mengapa Anda memposting ini? Bagaimana pernyataan ini relevan?
Mayou36
c) conda update -n ENVIRONMENT --all: Saya setuju bahwa inilah yang biasanya ingin ia gunakan, bukan untuk memperbarui lingkungan basis. Namun, saya tidak menemukan penjelasan dalam jawaban Anda tentang ini sama sekali, itu hanya ditulis dan tidak merujuk pada perbedaan menggunakan perintah op di lingkungan basis.
Mayou36
d) "Jika Anda hanya ingin memperbarui hampir semua, Anda dapat membuat file pin": ini adalah informasi yang bagus. Tapi bukan itu yang diminta OP. Dia ingin tahu mengapa dia tidak bisa memperbarui semua . Dia tidak ingin menjabarkan versi. Jadi itu tidak menambah jawaban, bukan?
Mayou36
2

Bayangkan grafik ketergantungan dari paket, ketika jumlah paket tumbuh besar, kemungkinan bertemu konflik ketika meningkatkan / menambahkan paket jauh lebih tinggi. Untuk menghindarinya, cukup buat lingkungan baru di Anaconda.

Hemat, pasang hanya yang Anda butuhkan. Bagi saya, saya menginstal paket-paket berikut di lingkungan baru saya:

  • panda
  • scikit-belajar
  • matplotlib
  • buku catatan
  • keras

Dan saya memiliki total 84 paket.

Spektral
sumber
Ini tidak menjawab pertanyaan tentang cara meningkatkan paket tertentu.
Mayou36
0

jika bekerja di MS windows, Anda dapat menggunakan Anaconda navigator. klik pada lingkungan, di kotak drop-down, itu "diinstal" secara default. Anda dapat memilih "dapat diperbarui" dan mulai dari sana

David
sumber
1
Tetapi bagaimana Anda memilih semua untuk memperbarui ketika ada terlalu banyak untuk dipilih secara individual?
beldaz
@ Beldaz, saya mencoba untuk 'menyelesaikannya' dengan memilih semua 141 paket di kolom terakhir dengan 'Versi', dan kemudian tekan Terapkan. Tidak yakin apakah itu berfungsi :(. Lalu saya baru saja membuka konsol Anaconda dengan menekan <win> Anaconda Prompt
Pieter21
Dijalankan sebagai Admin mungkin juga diperlukan
Pieter21
Ini tidak akan menyelesaikan masalah yang sebenarnya, baca jawaban yang diterima tentang konflik ketergantungan.
Mayou36
-1

Untuk memperbarui semua paket yang mungkin saya gunakan conda update --update-all

Berhasil!

nein nein
sumber
4
Tidak, itu "tidak": jika Anda membaca ulang OP, konflik ketergantungan ditemukan. Jawaban ini tidak menyelesaikan atau menjelaskan apa pun
Mayou36
-6

Saya memecahkan masalah ini dengan condadan pip.

Pertama, saya jalankan:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Setelah itu, saya membuka cmd dan menjalankan kode ini

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Terakhir, Anda harus menginstal matplotlibdalam pip dengan kode ini itupip install matplotlib

Mantakeke
sumber
6
Ini bahkan tidak mendekati apa yang OP ingin lakukan
user8408080