Search
🔢

Paper implementation code 실행을 위해 Python 환경 마련 중 알게 된 내용

python 실행의 본질

python2.x

python 2.x 를 실행하는 다양한 방법들에 대해서 알아보자.
$python
Bash
복사
$python2
Bash
복사
$python2.7
Bash
복사
$/usr/bin/python
Bash
복사

python3.x

이번에는 3.x 를 쉘에서 실행하는 방법에 대해서도 알아보자.
$python3
Bash
복사
$usr/bin/python3
Bash
복사
ubuntu 16.x 의 경우
$usr/bin/python3.5
Bash
복사
ubuntu 18.x 의 경우
$usr/bin/python3.6
Bash
복사

왜?

ubuntu 16.x 는 기본으로 python2.x 를 사용한다. 따라서, python 을 실행하면, usr/bin/python 을 찾게 되고, 이 파일은 곧 usr/bin/python2 파일으로의 바로가기이다.
usr/bin/python2 는 usr/bin/python2.7 으로의 바로가기이므로, usr/bin/python2.7 을 실행하게 된다.
이는 python3.x 에 대해서도 똑같이 적용된다. 하지만, 아까와 같은 이유로 ubuntu 16.x 을 사용할 때엔 python3 명령을 통해 실행해야 한다.
which 명령을 통해 python 을 실행하는 다양한 명령을 실행하는 경우, 어떤 파일을 실행하고 있는 것인지 모두 확인해 보자.
$which python $which python2 $which python2.x (x에는 당연히 적절한 숫자가 들어가야 합니다.) $which python3 $which python3.x
Bash
복사

이것을 알아야 하는 이유

2020년 현재, python 3.5 는 지원이 종료되고, 이는 비단 3.5 만의 문제가 아니며 추후 3.6 3.7 도 마찬가지일 것이다. 이런 경우, venv 와 같은 아주 기본적인 python module 도 설치가 불가능할 수 있다.
따라서, 적절한 버전을 ubuntu 에 설치하고, 이를 실행할 수 있도록 알고 있을 필요가 있다.
나의 경우, python 3.8.4 버전을 설치하기로 했다. https://www.python.org/downloads/ 에 가면 다양한 python 버전들을 다운로드할 수 있다.
ubuntu linux 의 경우, 소스 코드의 원본을 받아서 python 을 설치하는 방식을 사용한다. 설치가 진행되는 정확한 메커니즘은 알지 못하지만, 설치 과정은 굉장히 간단하다.
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus sudo apt-get install libncursesw5-dev libgdbm-dev libc6-dev sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev sudo apt-get install libssl-dev openssl sudo apt-get install libffi-dev
JavaScript
복사
(python 압축 푼 경로에서) ./configure make sudo make install
JavaScript
복사
위 코드는 아래 링크를 참고했다.
위 과정을 통해 설치가 완료된 후, 해당 폴더에서 python3 명령을 실행해 보자.
Python-3.8.6$python
Bash
복사
하지만, python2 의 실행 결과는 당연히 python2.5 (ubuntu 16.x 의 경우) 일 수밖에 없다. python 명령은 /usr/bin/python2 의 바로가기이기 때문이다.
python3.8.4 를 실행하기 위해서는 현재 디렉터리의 python 을 실해하도록 해서 아래와 같은 실행을 해야 한다.
Python-3.8.6$./python
Bash
복사
매번 이 디렉터리에 찾아들어와 실행하는 것은 너무 번거롭기 때문에, /usr/bin 디렉터리에 python3.8.6 의 바로가기를 추가해 주도록 하자.
$sudo ln -s ~/바탕화면/Python-3.8.6/python /usr/bin/python3.8.6
Bash
복사
ln 은 바로 가기를 만드는 명령이다. 문법은 ln {option} 원본 링크명 이고, -s option 은 소프트(심볼릭) 링크를 의미한다. 둘의 차이는 다른 문서를 참고하자. https://webdir.tistory.com/148
이제 python3.8.4 를 바로 실행해 보자.
$python3.8.4
Bash
복사

python -m 의 의미

python 의 pip 기능을 이용하다 보면, python -m pip install —upgrade 와 같은 명령어를 사용하게 된다. 때로는, python -m 을 생략하고 pip install —upgrade 또는 pip3 install —upgrade 명령어를 바로 사용하기도 한다. 이 둘은 무슨 차이이고, python 버전마다 다른 pip 를 어떻게 실행할 수 있을까? 라는 의문이 당연히 들게 된다.
python -h 를 통해 명령어의 종류에 대해서 알아보도록 하자. 위 내용에서 python 을 실행하는 경우 어떤 일이 일어나는지에 대해서 설명했다.
$python -h
Bash
복사
python -m 의 의미는, python 모듈을 독립적으로 실행시키겠다는 의미이다. 유추해 볼 때, pip 는 python 의 모듈이고, 모든 python version 마다 pip 모듈이 설치될 것이다.
$which pip $which pip3
Bash
복사
이 또한 /usr/bin/pip 와 /usr/bin/pip3 을 실행하는 것과 동치이고, 이들은 각각 python2.7 의 pip 와 python3.5 의 (ubuntu 16.x 의 경우) pip 와 연결이 되어 있는 것이다.
따라서, 정확한 명령은 다음과 같다.
$<내가 설치한 python> -m pip install --upgrade
Bash
복사
위에서 3.8.4 심볼릭 링크까지 등록이 완료됐다면 아래 명령을 통해, 내가 원하는 python 의 pip 를 업그레이드 가능하다.
$python3.8.4 -m pip install --upgrade
Bash
복사
python 3.8.x 의 경우, venv 가 기본적으로 설치되어 있기 때문에,
$python3.8.4 -m venv {만들 가상환경 디렉터리}
Bash
복사

참고: ROS에서는 종종 pip 도 못 잡는다

pip 는 기본적으로 설치되는 python 이 잡히는 경로인 /usr/bin 에 있지 않고, 상당히 이상한 경로에 존재한다.
WARNING: The scripts pip, pip2 and pip2.7 are installed in '/Users/janghoo/Library/Python/2.7/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Plain Text
복사
*참고 : 물론 MAC OS 의 경우 저 폴더를 Finder 로 구경하려면 숨김 폴더 보기를 풀어 주어야 한다. shift + command + .
그래서 아래 코드를 통해 symbolic link 를 걸어 주었다. 하지만, 마찬가지로 MAC OS X 에서는 /usr/bin 이 잠겨 아래 명령의 실행이 불가능하다.
sudo ln -s /Users/janghoo/Library/Python/2.7/bin/pip2.7 /usr/bin/pip2.7
JavaScript
복사
그래서 그냥 아래와 같이, pip 를 직접 실행해서 패키지들을 설치한다.
sudo /Users/janghoo/Library/Python/2.7/bin/pip2.7 install --user -U wstool rosdep rosinstall rosinstall_generator rospkg catkin-pkg sphinx
JavaScript
복사
4-20. ros permission issue
4-10. key issue
brew install wxpython rosdep install --from-paths src --ignore-src --rosdistro kinetic -y --skip-keys google-mock --skip-keys python-wxtools
JavaScript
복사

Python 의 import 경로 (pythonpath)

python import 시 python path (python 이 import 를 할 때 찾는 경로) 에 대해 조금 더 정확히 알 필요가 있다. 이를 정확히 모르고 있다면, 굉장히 뻘짓을 할 가능성이 높아지기 때문이다.
만약 인터프리터로 a.py 를 실행한다고 해 보자.
~$python3 folder/a.py
Bash
복사
# folder/a.py import sys print(sys.path)
Bash
복사
즉 interpreter 로 파일이 직접 실행되는 경우, sys.path 에는 해당 파일을 실행한 경로로 실행된다.
[~/folder, ... , ...]
Bash
복사
pythonpath 에 들어 있게 되는 디렉터리들을 정리하면 다음과 같다. (체크표시한 항목들)
python 을 설치할 때 같이 깔린 패키지들이 들어 있는 디렉터리
pip, apt 등을 통해 깔린 패키지들이 들어 있는 디렉터리들
b 를 실행하는 유저가 위치하는 디렉터리
c 를 import 하는 b 의 위치하는 디렉터리
하지만 만약 이런 경우는 어떨까?
마찬가지로 interpreter 로 파일을 직접 실행한다. 이 경우에는 folder/b.py 를 실행한다고 생각해 보자.
~$python3 folder/b.py
JavaScript
복사
b.py 는 folder 내의 folder_inside_folder 내의 c.py 를 실행한다.
import sys print(sys.path) import folder_inside_folder.c
Python
복사
folder/b.py
import sys print(sys.path)
Python
복사
folder/folder_inside_folder/c.py
자, 이때, c.py 가 실행된 경로 (folder/folder_inside_folder/) 가 python path 에 추가되었을까? 정답은 '그렇지 않다' 는 것이다. pythonpath 에 들어가는 디렉터리들을 정리하면 다음과 같다.
python 을 설치할 때 같이 깔린 패키지들이 들어 있는 디렉터리
pip, apt 등을 통해 깔린 패키지들이 들어 있는 디렉터리들
b 를 실행하는 유저가 위치하는 디렉터리
c 를 import 하는 b 의 위치하는 디렉터리
c 가 위치하는 디렉터리