Conda 가상환경을 shell script 한개로 여러 Python 환경 실행시키기

2019. 9. 21. 22:21꿀팁 분석 환경 설정

728x90

conda 나 virtualenv 같은 경우에는 환경을 여러 개를 만들 수 있다.

그렇다면 이러한 환경들을 여러 개로 다루면서, 사용하고 싶은 경우가 있다.

이 글에선 결론적으로 sh로 실행을 할 것이고, 그전에 일단 각각의 환경에 대해서 다른 버전을 제공하는지를 확인해보자.

일반적으로 환경에 접속을 하고 나서 실행을 한다.

보통은 activate를 하고 나서, 해당 파이썬에서 script를 실행한다.

## version check

conda info --envs
conda activate py36
python test.py

하지만 이런 경우에는 sh을 이용할 때 문제가 발생한다. 

일단 sh에서 conda activate 를 하고 python을 실행해주면 될 것 같기도 한데...(테스트 안 해봄)

그래서 좀 더 찾아보니 다음과 같이 script 버전은 다음과 같다.

해당 가상 환경의 python 실행파일에다가 뒤에는 script를 실행한다.

>> test.py

import sys
import argparse

print("hi")
print(sys.version)

parser = argparse.ArgumentParser(description ="사용법 테스트")
parser.add_argument("--env_path" , type = str , help ="타겟값")
parser.add_argument("--script_path" , type = str , help ="input")
parser.add_argument("--target" , type = str , help ="타겟값")
parser.add_argument("--input" , type = str , help ="input")
arg = parser.parse_args()



print("codna 환경 : " , arg.env_path)
print("script 경로 : " , arg.script_path)
print("인풋 : " , arg.input)
print("타겟 : " , arg.target)
/root/anaconda3/envs/py36/bin/python /home/~~/test.py

그래서 다음과 같이 각 환경별로 다른 환경이 나오는 것을 알 수 있다.

>> RUN.sh

#!/bin/bash

echo "Executing a bash statement"

$1 $2 --env_path=$1 --script_path=$2 --input=$3 --target=$4

 

이런 식으로 shell을 만들면 환경 변수를 $1 번에서 받고 $2번에서 원하는 부분의 script를 선택하면 된다!

/home/RUN.sh /root/anaconda3/envs/kafka/bin/python /home/test.py 인풋 타겟

/home/RUN.sh /root/anaconda3/envs/py36/bin/python /home/test.py 인풋 타겟

이런 식으로 공통 shell을 만들고 원하는 환경의 주소를 적어주면 다양한 환경에서 실행해줄 수 있다!

그래서 각각 다른 환경에서 만든 것을 환경에 맞게 활용해서 할 수가 있다!

>> 여러 환경을 원하는 것을 쓸 수 있다는 장점이 있으니 유용하게 써야겠다.

예상 상황을 시뮬레이션해서 만들기

폴더에 특정 가상환경 이름을 정보를 저장한 것을 읽게해서 가상환경에 바꿔서 작동할 수 있도록 해보기

env_info.txt 파일을 읽게 한다음 그 가상환경 이름을 가져와서 적용시키기 (여러 환경 대비)

>> RUN.sh

#!/bin/bash

echo "Executing a bash statement"

set_env=$1
folder=$2

while read env; do echo $env; done < $folder/env_info.txt

$set_env/$env/bin/python $folder/test.py --env_path=$set_env --script_folder=$folder --input=$3 --target=$4 --env=$env

>> test.py

import sys
import argparse

print("hi")
print(sys.version)

parser = argparse.ArgumentParser(description ="사용법 테스트")
parser.add_argument("--env_path" , type = str , help ="타겟값")
parser.add_argument("--script_folder" , type = str , help ="input")
parser.add_argument("--env" , type = str , help ="input")
parser.add_argument("--target" , type = str , help ="타겟값")
parser.add_argument("--input" , type = str , help ="input")
arg = parser.parse_args()




print("codna 경로 : " , arg.env_path)
print("script 폴더 경로 : " , arg.script_folder)
print("가상 환경 이름 : " , arg.env)
print("인풋 : " , arg.input)
print("타겟 : " , arg.target)

왼쪽 : tensorflow2 가상환경 / 오른쪽 py35 가상환경

>> 전에는 당연히 안되는 줄 알았는데, 당연히 되는 것이었다.(반성x10)

728x90