Helpex - Trao đổi & giúp đỡ Đăng nhập

Python - Kích hoạt conda env thông qua shell script

Phan Thành Trung
· 03:46 04/04/2019
5 giờ trước

Tôi hy vọng sẽ chạy một tập lệnh shell đơn giản để dễ dàng quản lý xung quanh một số môi trường chung cư. Kích hoạt môi trường conda thông qua conda activatetrong một hệ điều hành linuxhoạt động tốt trong shell nhưng có vấn đề trong tập lệnh shell. Ai đó có thể chỉ cho tôi đúng hướng tại sao điều này lại xảy ra không?

Ví dụ để lặp lại vấn đề:

# default conda env
$ conda info|egrep "conda version|active environment"
     active environment : base
          conda version : 4.6.9

# activate new env to prove that it works
$ conda activate scratch
$ conda info|egrep "conda version|active environment"
     active environment : scratch
          conda version : 4.6.9

# revert back to my original conda env
$ conda activate base 

$ cat shell_script.sh
#!/bin/bash
conda activate scratch

# run shell script - this will produce an error even though it succeeded above
$ ./shell_script.sh

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.
33 hữu ích 2 bình luận 66k xem chia sẻ
Võ Xuân Yến
· 04:39 04/04/2019
04:39:17 04/04/2019

Thông báo lỗi khá hữu ích - nó cho bạn biết rằng conda không được thiết lập đúng cách từ bên trong vỏ con mà tập lệnh của bạn đang chạy. Để có thể sử dụng conda trong một tập lệnh, bạn cần (như thông báo lỗi cho biết) chạy conda init bash(hoặc bất kể vỏ của bạn là gì) trước tiên. Hành vi của conda và cách nó được thiết lập tùy thuộc vào phiên bản conda của bạn, nhưng lý do cho hành vi của phiên bản 4.4+ condalà phụ thuộc vào các biến môi trường nhất định thường được thiết lập bởi chính conda shell. Quan trọng nhất, mục nhập thay đổi này giải thích lý do tại sao các lệnh conda activatedeactivatelệnh của bạn không còn hoạt động như bạn mong đợi trong các phiên bản 4.4 trở lên.

Để thảo luận thêm về điều này, hãy xem vấn đề chung cư chính thức trên GitHub.


Chỉnh sửa: Một số nghiên cứu khác cho tôi biết rằng conda initchức năng được đề cập trong thông báo lỗi thực sự là một tính năng v4.6.0 mới cho phép thiết lập môi trường nhanh chóng để bạn có thể sử dụng conda activatethay vì tính năng cũ source activate. Tuy nhiên, lý do tại sao điều này hoạt động là nó thêm / thay đổi một số biến môi trường của trình bao hiện tại của bạn và cũng thực hiện các thay đổi đối với tệp RC của bạn (ví dụ .bashrc:) và các thay đổi tệp RC không bao giờ được chọn trong trình bao hiện tại - chỉ trong mới được tạo vỏ sò. (Tất nhiên là trừ khi bạn lấy lại nguồn .bashrc). Trên thực tế, conda init --helpnói càng nhiều:

QUAN TRỌNG: Sau khi chạy conda init, hầu hết các trình bao sẽ cần được đóng và khởi động lại để các thay đổi có hiệu lực

Tuy nhiên, rõ ràng bạn đã chạy conda init, vì bạn thể sử dụng conda activatetương tác. Trên thực tế, nếu bạn mở .bashrc của mình, bạn sẽ có thể thấy một vài dòng được thêm vào bởi conda dạy shell của bạn nơi tìm kiếm các lệnh conda. Tuy nhiên, vấn đề với tập lệnh của bạn nằm ở chỗ .bashrc không có nguồn gốc bởi vỏ con chạy các tập lệnh trình bao (xem câu trả lời này để biết thêm thông tin). Điều này có nghĩa là mặc dù trình bao tương tác không đăng nhập của bạn nhìn thấy các lệnh conda, nhưng các hộp con tập lệnh không tương tác của bạn sẽ không - bất kể bạn gọi bao nhiêu lần conda init.

Điều này dẫn đến một phỏng đoán (bản thân tôi không có conda trên Linux, vì vậy tôi không thể kiểm tra nó) rằng bằng cách chạy tập lệnh của bạn như sau:

bash -i shell_script.sh

bạn sẽ thấy conda activatecông việc chính xác. Tại sao? -ilà một cờ bash cho biết trình bao bạn đang bắt đầu chạy ở chế độ tương tác, có nghĩa là nó sẽ tự động tạo nguồn .bashrc của bạn. Điều này đủ để cho phép bạn sử dụng conda trong tập lệnh của mình như thể bạn đang sử dụng nó bình thường.

23 hữu ích 5 bình luận chia sẻ
Huỳnh Thụy Du
· 12:53 02/07/2019
12:53:55 02/07/2019

Tôi sử dụng 'lệnh nguồn' để chạy tập lệnh shell, nó hoạt động:

source shell_script.sh
25 hữu ích 4 bình luận chia sẻ
Bùi Dạ Yến
· 13:37 24/09/2019
13:37:15 24/09/2019

Giải pháp nhanh cho bash: thêm tập lệnh init sau vào các tập lệnh Bash của bạn.

eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"

Làm xong.


Đối với các shell khác, hãy kiểm tra init conf của shell của bạn, sao chép nội dung sau trong shell conf và thêm nó vào các tập lệnh của bạn.

# >>> conda initialize >>>
...
# <<< conda initialize <<<

Bạn cũng có thể dùng

conda init --all --dry-run --verbose

để lấy init script bạn cần trong các script của mình.

Giải trình

Điều này liên quan đến việc giới thiệu conda inittrong conda4.6.

Trích dẫn từ nhật ký phát hành conda 4.6

Conda 4.4 cho phép "conda kích hoạt envname". Vấn đề là việc thiết lập shell của bạn để sử dụng tính năng mới này không phải lúc nào cũng đơn giản. Conda 4.6 bổ sung hỗ trợ khởi tạo mở rộng để nhiều shell hơn bao giờ hết có thể sử dụng lệnh “conda active” mới. Để biết thêm thông tin, hãy đọc đầu ra từ “conda init –help”

Sau khi conda initđược giới thiệu trong conda4.6, conda chỉ hiển thị lệnh condavào PATHchứ không phải tất cả các tệp nhị phân từ "cơ sở". Và công tắc môi trường được thống nhất bởi conda activate env-nameconda deactivatetrên tất cả các nền tảng.

Nhưng để làm cho các lệnh mới này hoạt động, bạn phải khởi tạo bổ sung với conda init.

Vấn đề là tệp tập lệnh của bạn được chạy trong một trình bao con và condakhông được khởi tạo trong trình bao con này.

Người giới thiệu

16 hữu ích 2 bình luận chia sẻ
Võ Vĩnh Khoa
· 09:45 04/03/2020
09:45:02 04/03/2020

Việc sử dụng conda activatehoặc source activatetrong các tập lệnh shell không phải lúc nào cũng hoạt động và có thể gây ra các lỗi như thế này. Một công việc dễ dàng xung quanh nó để đặt source ~/miniconda3/etc/profile.d/conda.shtrên bất kỳ conda activatelệnh nào trong script:

source ~/miniconda3/etc/profile.d/conda.sh # Or path to where your conda is
conda activate some-conda-environment

Đây là giải pháp đã làm việc cho tôi và cũng sẽ hoạt động nếu chia sẻ tập lệnh. Điều này cũng xoay quanh việc phải sử dụng conda initvì trên một số cụm tôi đã làm việc với hệ thống được khởi tạo nhưng conda activatevẫn không hoạt động trong tập lệnh shell.

9 hữu ích 2 bình luận chia sẻ
Huỳnh Yên Nhiên
· 19:17 23/10/2019
19:17:30 23/10/2019

Vấn đề là gì với việc đơn giản thực hiện một cái gì đó như thế này trong trình bao của bạn:

nguồn /opt/conda/etc/profile.d/conda.sh

(Init chung cư vẫn được đánh dấu là Thử nghiệm và do đó không chắc liệu bạn có nên sử dụng nó hay không).

2 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x anaconda conda , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm