Instal hanya paket yang tersedia menggunakan "conda install --yes --file requirement.txt" tanpa kesalahan

96

Saat menginstal paket di requirement.txt menggunakan Conda melalui perintah berikut

conda install --yes --file requirements.txt

Jika sebuah paket di requirement.txt tidak tersedia, maka ia akan memunculkan "No package error" seperti yang ditunjukkan di bawah ini:

Menggunakan situs Anaconda Cloud api https://api.anaconda.org

Mengambil metadata paket: ....

Kesalahan: Tidak ada paket yang ditemukan di saluran linux-64 saat ini yang cocok: nimfa == 1.2.3

Anda dapat mencari paket ini di anaconda.org dengan

anaconda search -t conda nimfa ==1.2.3

Alih-alih memberikan kesalahan, apakah mungkin untuk mengubah perilaku ini sehingga menginstal semua paket yang tersedia di requirement.txt dan memberikan peringatan untuk paket yang tidak tersedia?

Saya ingin ini karena, paket nimfa yang dikatakan error tidak tersedia, dapat diinstal dengan pip. Jadi jika saya dapat mengubah perilaku conda install --yes --file requirements.txtuntuk hanya memberikan peringatan untuk paket yang tidak tersedia, saya dapat menindaklanjutinya dengan perintah pip install -r requirments.txtdi .travis.yml sehingga TravisCI mencoba menginstalnya dari tempat mana pun yang tersedia.

cdeepakroy.dll
sumber

Jawaban:

171

Saya akhirnya hanya mengulangi baris file

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

Edit : Jika Anda ingin menginstal paket menggunakan pip jika tidak tersedia melalui conda, cobalah ini:

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

Edit : Jika Anda menggunakan Windows (kredit diberikan ke @Clay ):

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

Sampai Hoffmann
sumber
5
Terima kasih untuk ini, sedikit petunjuk bagi siapa pun yang menggunakannya, pastikan persyaratan.txt Anda diakhiri dengan baris baru, sehingga paket terakhir terbaca
Marawan Okasha
1
Apakah ada cara untuk juga secara otomatis pip installmemaketkan yang tidak tersedia menggunakan conda install, saat melakukan iterasi?
PeterB
2
@delusionX, saya telah memperpanjang jawabannya.
Sampai Hoffmann
11
Solusi @TillHoffmann pada mesin Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" Bekerja dengan sangat baik. Terima kasih!
Clay
3
Jika Anda berkomentar di file persyaratan, pip mengeluh secara verbal (mengganggu jika tidak berbahaya). Variasi dari bash one-liner yang mengabaikan komentar:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko
1

Bagi mereka yang mencari, saya menggunakan ini sebagai solusi @TillHoffmann untuk cangkang ikan:

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

Dan

$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt
Yuri-M-Dias
sumber
1

Jawaban Pbms di sini adalah cara yang tepat untuk melakukannya, dengan asumsi Anda memiliki lingkungan yang ada untuk disalin. Conda sepenuhnya mampu menginstal paket Conda dan paket pip, seperti yang tercantum di environment.yml. Saya ingin mendokumentasikan keseluruhan proses secara lebih rinci. Perhatikan bahwa saya menggunakan lingkungan berbasis folder, itulah sebabnya saya menambahkan --prefix [path to environment folder]sebagian besar perintah.

Katakanlah Anda menginstal lingkungan untuk proyek yang ada ke folder yang disebut envdi folder saat ini, seperti ini:

conda create --prefix ./env

Anda akan menghasilkan environment.ymluntuk lingkungan proyek itu seperti ini:

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

Anda akan membuat lingkungan baru dalam beberapa folder lain dengan menyalin environment.ymlke sana dan kemudian menjalankannya dari sana:

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

Anda akan mendapatkan lingkungan yang sudah ada untuk dicocokkan environment.ymldengan sekali lagi menyalin environment.ymlke sana dan kemudian menjalankannya dari sana:

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

Dengan lingkungan yang dimaksud aktif, Anda akan memverifikasi status paketnya seperti ini:

conda list

Ini adalah versi singkat dari apa yang mungkin dicetak oleh perintah itu (perhatikan bahwa paket pip ditandai 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

Akhirnya, ini adalah versi ringkasan dari apa yang environment.ymlmungkin terlihat (perhatikan bahwa paket pip terdaftar dalam kategorinya sendiri):

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

Ketahuilah bahwa menggunakan Conda dan pip bersama-sama dapat menyebabkan mulas karena keduanya tanpa sadar dapat menghilangkan ketergantungan satu sama lain. Anda diharapkan untuk menginstal semua paket Conda Anda terlebih dahulu dan kemudian semua paket pip Anda sesudahnya, daripada bergantian di antara keduanya. Jika lingkungan Anda rusak, rekomendasi resminya adalah menghapus dan membuatnya kembali (dari environment.ymlfile Anda ). Untuk lebih jelasnya, lihat panduan ini:

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

MarredCheese
sumber