기록용으로 남깁니다.
보통 환경 변수가 필요할 때 VAR1="this_value" python3 aa.py 와 같이 변수=값 을 앞에 써주고 그 뒤에 실행시킬 명령(python3 aa.py)을 써주면서 사용합니다.
이런 저런 테스트로 노가다를 하다가 보니 이런 생각이 들었습니다.
argument 로 aa.py 가 해석할 명령을 주는데 그거와 별개로 파라미터를 명령 해석 및 실행이 아니라 다른 방식 또는 모드 지정을 하고 싶다는 생각이었습니다.
다만, 그렇게 하려면 키워드 옵션 지정해서 처리하거나 argparse 를 써서 설정해야 하는데 귀찮더군요..
그래서 생각해낸 게 환경 변수였습니다. 파이썬에서도 자신의 환경 변수에 접근할 수 있으니(os.environ) 어떻게든 되겠지라는 생각을 했습니다.
다만, 라즈베리파이4B 환경에서 텐서플로우를 돌려야 하는 프로젝트에 구현을 하는데 무슨 이유에서인지 libgomp.so.1 오류가 발생하고 있어서 LD_PRELOAD 옵션을 지정하고 실행을 하고 있었습니다. 그래서 환경 변수로 명령을 전달하려면 LD_PRELOAD 를 포함한 2개 이상의 환경 변수를 한 줄에 지정할 수 있어야 했었습니다.
이런 저런 삽질과 검색 끝에 방법 한가지를 찾아서 기록으로 남깁니다. 그 외에도 다른 방법들이 제시되어 있었지만 제가 가진 환경에서는 이 방법만 정상 동작했습니다.
일단 변수 이름은 각각 _END 와 _METHOD 로 지정했습니다.
그 값은 더미로 각각 "hi" 와 "mixed" 를 지정했습니다.
read -r _END _METHOD < <(echo "hi" "mixed") && python3 aa.py
이제 aa.py 에서 os.environ 에 접근하면 됩니다. 안됩니다...
import os
END=os.environ.get("_END")
METHOD=os.environ.get("_METHOD")
※참고로 environ 전체 내용이 궁금해서 출력해봤습니다.
위와 같이 read 로 읽은 변수는 그 명령행에만 실행되고 그 다음 명령(; 로 구분)에서는 유효하지 않습니다.
export 로 지정해야 그 이후에도 그 값이 유지됩니다. 다음 명령으로는 _END 가 잘 인식됩니다.
이마저도 귀찮으면 다음과 같이 txt 파일에 저장해놓고
cat configs.txt
_END="hi"
_METHOD="mixed"
set 명령의 allexport 또는 a 명령을 사용해서 처리할 수도 있습니다.
set -a ; . configs.txt ; set +a
또는
set -o allexport
. configs.txt
set+a
'IT > bash' 카테고리의 다른 글
[bash] 배열 선언 및 원소 추가하기 (0) | 2023.02.24 |
---|---|
[bash] 파일에서 줄단위로 읽어서 한줄씩 처리하기 (0) | 2021.11.18 |