○ 매직 명령어 (magic commands)
ipython과 주피터에는 % 로 시작하는 명령어들이 있다. 이런 명령어들을 매직(magic) 명령어라고 부른다. 파이썬의 정식(?) 명령어 라기 보다는 cmd에서 (운영체제에서) 사용할 만한 명령어들을 사용자들의 편의를 위해 파이썬 안으로 들여왔다고 보면 좋겠다. 실제 폴더나 파일을 관리할 수 있는 다수의 명령어들이 포함되어 있다. 파이썬과 대화형으로 (interactive 하게) 문제를 풀어갈 때 사용할 수 있는 명령어들로서, 실제 파이썬 코딩 내에서는 사용할 수 없다.
매직 명령어의 전체 리스트는 %lsmagic (ls는 list라는 뜻) 으로 확인할 수 있다 (%lsmagic은 %없이 그냥 lsmagic으로도 실행됩니다).
참고로, % 하나로 시작하는 명령어가 있고, % 2개 (%%) 로 시작하는 명령어가 있다. % 하나로 시작하는 매직 명령어를 line 매직 명령어, %%로 시작하는 명령어를 cell 매직 명령어로 구분한다. 명령어의 효과가 1개 라인에만 미치면 라인 매직 명령어가 되고, 여러 줄에, 즉 셀 전체에, 영향을 미치면 셀 매직 명령어가 된다.
이 중에서 폴더와 파일 관리를 위해 필요한 몇가지 명령어 위주로 살펴보도록 하자. 여기서 살펴볼 명령어들은 %ls, %cd, %mkdir, %pwd, %edit, %%writefile, %load, %run 등이다. 이 명령어들은 대부분 파일 (File) 을 관리하는데 관련된 명령어들이다.
ipython 이나 주피터 노트북으로 코딩하려면 파일관리가 기본이다. 파일과 폴더 관리를 위한 매직 명령어들에 익숙해질 필요가 있다.
○ 우선, 파일과 폴더에 대해 알아보자
우리 컴퓨터에 저장된 정보들의 가장 기본적인 단위는 파일 (File) 이다. 한글, 워드, 파워포인트, 엑셀 등의 애플리케이션을 사용해서 문서를 편집하고 저장하게 되면 하나의 파일이 만들어진다. 각 파일들은 파일의 이름과 확장자 (extention) 로 구별된다. 예를 들어, 아래아 한글로 문서를 만들어서 문서의 이름을 "보고서"라고 저장하면 "보고서.hwp" 라는 이름으로 파일이 만들어진다. 그리고, 파일을 처음 저장할 때에는 해당 파일을 저장하게 될 폴더 (일종의 저장공간)를 지정하게끔 되어 있다.
예를 들어, 친구로 부터 아반저스-앤드게임 (avangers-andgame) 라는 이름의 영화 파일을 하나 얻었다고 하자. 파일 형식은 mp4 이어서 파일의 풀네임은 avengers-andgame.mp4 가 된다. 이제 이 파일을 컴퓨터에 저장하려고 하는데, 그럴려면 이 파일을 저장할 폴더를 지정해 주어야 한다. 즉, 어디에다 저장하겠냐는 것이다. 폴더는 일종의 공간으로 그 내부에 파일을 저장할 수 있고, 또 다른 폴더를 포함시킬 수 있다.
현재 c 라는 이름의 하드디스크 (보통 c: 라고 표시하고 c 드라이브라고 부른다) 에는 Windows (윈도우 운영체제가 설치된 폴더), Program Files 폴더 (각종 애플리케이션들이 설치된 폴더) 가 있다. 이 폴더에 영화를 넣기는 이상해서 새롭게 Movies 라는 이름으로 폴더를 하나 만들었다. 그리고 영화 파일을 c:\Movies 라는 폴더에 옮겨 두었다.
이제 아반저스 파일을 찾으려면 어디를 가야 하나? C: 드라이브 밑에 있는 Movies 라는 폴더를 열어봐야 한다. 이것을 c:\Movies 라고 표현한다. 아반저스 파일은 c:\Movies 아래에 있으니 우리가 아반저스 파일에 접근하려면 c:\Movies에 방문해야 한다. 여기서 c:\Movies를 어벤저스 파일의 경로(path)라고 부른다. 내가 찾고자 하는 파일을 찾는 "길"이란 의미다. 아직 "길" 같지는 않은가?
이렇게 영화파일을 모으기 시작해서 4년동안 영화파일을 100개를 모았다. 하나의 폴더에 100개의 파일이 있다보니, 내가 원하는 파일을 찾기가 너무 어렵다. 그래서, 분류할 필요가 생겼다. 이 파일들을 비슷한 것들 끼리 묶어서 서로 다른 폴더에 저장해 보기로 했다. 어떻게 분류할 것인가? 동양영화와 서양영화로 나누기로 하고, 동양영화를 위해서 East 란 이름의 폴더를, 서양영화를 위한 West 란 이름의 폴더를 새로 만들었다. 이제 아반저스 파일은 어디에 위치해야 하는가? 미국에서 만든 영화이니 c:\Movies\West 폴더 아래에 저장해 두었다. 이제 avangers-andgame.mp4 를 만나려면 어디로 가야 하는가? c: 드라이브 밑의 Movies 폴더에 가서, 그 아래에 있는 West 폴더를 찾으면 된다. 즉, 아반저스 파일의 경로는 c:\Movies\West 가 된다.
이 경로들을 그림으로 나타내면 Tree (나무) 가 된다. c:를 뿌리로 해서 3개의 가지(branch)가 벌어지는데, 한 가지는 이름이 Windows 이고, 또 한 가지는 Program Files 이고, 나머지 한 가지는 Movies 이다. Movies 가지에서 또 2개의 가지로 나뉘는데 East 와 West 가 그것이다. 여기서 c: 를 나무의 뿌리라는 의미에서 root 디렉토리라고 부른다. 그리고 하나의 폴더를 기준으로 그 폴더를 포함하는 상위의 폴더가 있고, 그 폴더가 포함하고 있는 하위의 폴더가 있다. 상위의 폴더를 부모 디렉토리 (parent directory) 라고 부르고 하위의 폴더를 서브 디렉토리 (sub directory) 라고 부른다. 아래의 예에서 Movies는 West의 부모 디렉토리이고, West는 Movies의 서브 디렉토리가 된다.
실제의 예를 한번 살펴보자. 아래는 파이썬의 가상환경이 설정되어 있는 c:\devpy 폴더 내의 내용을 보이고 있다. devpy 폴더 안에는 etc, Include, Lib, Scripts, share 라는 이름의 5개 서브 폴더가 있고 pyvenv.cfg 라는 이름의 파일이 하나 저장되어 있다.
여기서, 임의로 Lib 라는 폴더를 클릭하게 되면, 탐색기의 모양은 다음 그림과 같이 바뀌게 된다. 현재 탐색기는 c 드라이브 밑에 있는 devpy 폴더의 서브 폴더인 Scripts 의 내용을 보이고 있다.
참고로, 파일이름과 폴더 이름은 대, 소문자를 구별하지 않는다.
○ %pwd
pwd 는 present working dirctory 라는 뜻으로 현재의 작업폴더를 의미한다. 현재의 작업폴더란 의미는 우리가 파일을 만들게 되면 그 파일은 pwd에 저장된다는 의미이다.
실제로 %pwd 라는 매직 명령어를 실행하면 아래와 같이 현재의 폴더 경로를 보여준다. 참고로, 도스(DOS)나 유닉스(Unix)에서는 폴더를 디렉토리라고 부른다. 아래의 실행 예를 보자. %pwd 매직 명령어가 실행되고 결과로 'C:\\devpy\\Scripts' 가 출력되었다. (여기서, 백슬래쉬와 \ 심볼은 같은 문자이다.) 이것은 현재의 작업 폴더가 C:\devpy\Scripts 라는 것을 나타낸다. 경로를 나타낼 때에는 백슬래시가 하나만 사용되는데, %pwd의 출력에서 2개의 백슬래시가 사용되고 있음에 유의하자 (관련 내용은 [python 14 파이썬 문자열] 에서 다룬 이스케이프 문자를 참고하기 바람)
○ %ls
%ls 는 list 의 준말로, 현재 폴더의 내용 (현재 폴더에 포함되어 있는 폴더들과 파일들) 의 리스트를 보여주는 매직 명령어이다. In[42]는 현재 폴더 (c:\devpy)의 내용들을 보여 주고 있다. 빨간색 박스로 표시한 부분을 제외하면 7줄의 내용이 있는데, 이 중 <DIR> 로 표시된 줄은 디렉토리를 표시하고, <DIR> 이 없는 줄은 파일을 표시한다. 내용을 살펴보면, 현재 devpy 폴더 내에는 etc, Include, Lib, Scripts, share 라는 이름으로 5개의 디렉토리가 있다. 파일로는 98바이트 크기의 pyvenv.cfg 파일이 있음을 알 수 있다.
빨간색 박스로 표시한 부분에서 . 는 현재의 디렉토리 자신을 나타내고 .. 는 현재 디렉토리의 부모 디렉토리를 나타낸다. 여기서 사용된 . 과 .. 은 상대적 경로를 표현할 때 사용된다.
%ls 명령어 뒤에 옵션을 넣어 필요한 내용들만 선별하여 볼 수 있다. 특별히, 현재 폴더에 있는 파일들 중 확장자가 .py 인 파일들의 리스트 만 보고 싶다면 %ls *.py 라고 하면 된다. 여기서 *는 와일드 문자(wild character)라고 부르고 문자의 개수에 무관하게 모든 이름과 매치가 된다. 즉, 확장자가 .py인 모든 이름의 파일을 보여 달라는 명령이 된다. 예를 보이면 아래와 같다. 리스트된 모든 파일의 확장자가 .py 라는 것에 유의하자.
만약에 확장자 무관하게 파일이름이 n 으로 시작하는 파일이나 폴더의 리스트를 보고 싶다면 %ls n*.* 이라고 하면 된다. 아래의 사용예를 보자.
특별히, 현재 폴더의 서브 디렉토리 만을 보고 싶을 때에는 다음과 같이 %ls *. 이라고 하면 된다.
○ %mkdir
%mkdir 명령어를 사용해서, 주피터 노트북 내에서 디렉토리(폴더)를 새로 만들 수 있다. mkdir 은 make directory의 준말이다. 현재 .폴더는 c:\devpy\scripts 이다.
여기에, 내가 만들 파이썬 파일들을 저장하는 용도로 myown 이란 이름의 폴더를 만들고자 한다. 그럼 현재 폴더에서 %mkdir myown 이라고 하면 된다. %mkdir [폴더 이름] 하면 [폴더 이름]에 해당하는 이름의 폴더가 현재 폴더 (pwd) 의 서브 디렉토리로 만들어 진다. 아래에서 그 결과를 살펴보자.
○ %cd
내가 원하는 파일에 접근하려면 그 파일이 저장되어 있는 폴더에 먼저 접근할 수 있어야 한다. 그래서, 폴더를 여기 저기 옮겨 다닐 수 있어야 하는데, 그럴 때 %cd 매직 명령어를 활용할 수 있다. %cd 는 change directory의 준말이다. %cd 명령어는 기본 문법은 %cd [폴더 이름] 이다. 여기서 [폴더 이름]은 내가 옮겨 가고 싶은 디렉토리의 경로가 들어간다. 이 경로에는 절대 경로와 상대경로로 나눌 수 있는데, 루트 디렉토리를 기준으로 경로를 표시하는 경우를 절대 경로라고 하고, 현재의 pwd를 기준으로 경로를 표시하는 것을 상대 경로라고 부른다.
만약 폴더 구조가 아래와 같고, 현재의 작업폴더는 West 라고 하자.
어떤 폴더에서 가장 쉽게 이동할 수 있는 폴더는 부모 디렉토리와 서브 디렉토리이다. 어떤 폴더에 있던지 간에 부모 폴더는 .. (2개의 dot dot) 으로 표현된다. 현재 폴더에서 자기 폴더를 포함하고 있는 부모 폴더 (당연히 1개 뿐이다)로 이동하고 싶으면 %cd .. 이라고 하면 된다.
서브 디렉토리 중에 한 곳으로 이동하고 싶으면 %cd 에 그 디렉토리의 이름을 적어주면 된다. 예를 들어, 현재 West에서, West 아래에 있는 Romance로 이동하고 싶다면 %cd romance 라고 하면 된다
현재의 폴더를 . (dot)으로 표시한다. 그래서 현재의 디렉토리 밑에 있는 Romance 란 의미로, .\Romance 라고 쓰기도 한다.
그렇다면 현재 폴더에서 Windows 폴더로 가려면 어떻게 가야 할까? 전체 폴더 구조를 나무(Tree)로 보면 하나의 폴더는 하나의 나뭇가지(branch)에 해당한다. 다른 나무 가지에 가려면 그 가지가 벌어진 마디까지 내려가서 다시 올라가야 하는 방법 밖에 없다.
현재 폴더인 West에서 Windows 로 가려면 우선 Movies로 갔다가, Movies의 부모 디렉토리인 루트로 갔다가, 루트의 서브 디렉토리인 Windows로 가야 한다.
아래와 같은 방식으로 3번의 홉(hop, 뜀뛰기)으로 Windows 폴더로 이동할 수 있다.
상대적으로 가까이 있지 않은 폴더인 경우 이와 같이 상대적 경로로 이동하기는 조금 번거롭다. 이럴 경우에 효과적인 것이 절대 경로이다. 절대 경로는 루트 디렉토리를 기준으로 하는 경로를 말한다. 예를 들어, East 폴더의 절대 경로는 c:\Movies\East 이고 Romance 폴더의 절대 경로는 c:\Movies\West\Romance 가 된다. 아래의 예를 보자.
위에서 폴더 및 디렉토리 관리에 대해 살펴 보았다. 이제 부터는 파일과 관련된 매직명령어들을 살펴보기로 하자.
파일과 관련된 매직 명령어들은 파일은 만들고, 띄우고, 실행하는 것과 관련되어 있다. 파일을 만들기 위한 %%writefile, 파일을 띄우기 위한 %load, 파일을 실행하기 위한 %run 을 주로 사용한다. 아래에서 그 사용예를 보기로 하자.
○ %%writefile
주피터 노트북의 셀에서 %%writefile [파일 이름] 을 입력한 후에, 그 다음 부터 입력된 내용은 [파일 이름] 의 파일로 저장된다. writefile 이란 매직명령어 앞에 %%가 붙어 있는 것은 셀 전체에 적용되는 명령어임을 나타내는 것이다.
%%writefile 실행 후에 디렉토리 내용을 보면, pwd에 해당파일이 저장되어 있음을 확인할 수 있다.
○ %load
%load는 컴퓨터에 저장되어 있는 파이썬 파일을 불러와서 수정할 수 있는 매직 명령어이다. 위에서 저장했던 test1.py 의 내용을 확인하거나 수정하고 싶은 경우에는 %load test1.py 를 실행하면 된다. 물론, 현재 디렉토리(pwd)에 해당 파일이 존재해야 한다. 셀에서 아래와 같이 명령어를 입력한 후에 엔터키를 누르면
입력했던 매직명령어가 코멘트 처리 되면서, 해당파일의 내용이 셀로 불려지게 된다. 여기서, 실제 내용을 수정할 수 있다. 셀을 실행 (Shift+Enter)하면 수정된 내용으로 업데이트된다. 수정된 내용을 파일로 저장하려면 앞에서 살펴본 %%writefile 명령어를 사용하면 된다.
○ %run
%run 은 파이썬 파일을 실행하는 명령어이다. 예를 들어, 다음과 같이 3개의 명령어로 구성된 sample.py 파일을 만든 경우에 %run sample.py 를 실행하면 해당파일의 명령어를 바로 실행할 수 있게 된다.
○ 외부 에디터를 사용하는 경우 (Notepad++)
위에서 파이썬 파일을 작성하고, 주피터 노트북 안으로 불러 들이고, 실제 실행하는 과정을 살펴 보았다. 사실, 명령어가 몇 줄 안되는 간단한 파일들은 주피터 노트북이 제공하는 매직 명령어를 이용해서 간단하게 관리할 수 있지만, 큰 사이즈의 파이썬 파일들은 매직 명령어로 관리하기 어렵다. 이럴 때 유용하게 사용할 수 있는 것이 외부 에디터를 활용하는 방법이다. 여러 대안이 가능하겠지만, 여기서는 노트패드++ (notepad++)를 활용하는 방법을 소개한다.
노트패드++는 윈도우즈에서 기본으로 설치되는 https://notepad-plus-plus.org 에서 무료로 구할 수 있다. 화면 좌측 프레임의 중간에 Current Version 7.8.5 링크를 클릭하면 최근버전의 노트패드++를 다운로드 받아 설치할 수 있다.
범용 에디터인 노트패드++를 파이썬 프로그램 에디터로 활용하기 위해서는 [새파일]을 만들고, [다른 이름으로 저장]하되 확장자가 .py가 되도록 해 주면 된다. 그러면 노트패드++는 파이썬 프로그램 편집을 위한 하이라이트와 도움말 기능 등을 제공한다. 참고로, 노트패드++에서 NppExec 라는 이름의 플러그인(확장)을 설치하면 노트패드++ 안에서 파이썬 코드를 실행할 수 있지만, 우리 블로그에서는 편집은 노트패드에서 컴파일과 실행은 ipython이나 주피터노트북에서 하는 것으로 한정한다.
아래는 abc.py 라는 파이썬 파일을 작성한 화면이다. 작성이 완료되면, 파이썬 가상환경 폴더에 저장하고 종료한다.
이제 주피터 노트북에서 %ls 명령어를 이용해서 해당 파일을 확인하고, %load 한 후에 실제 실행할 수 있다. 그 과정을 보이면 아래의 그림과 같다.
노트패드++ 외에도, 우리가 파이썬 소프트웨어 개발을 위해 사용할 수 있는 개발환경들은 많이 있다. 여기서, 개발환경이란 하나의 애플리케이션 내에서 파이썬 프로그램을 편집(Edit)하고 번역(Compile) 하고 실행(Execute) 할 수 있는 환경을 말한다. 사실 가장 좋은 대안은 스파이더(spyder), 파이참(pyCharm) 등 파이썬 전용 개발도구를 사용하는 것이다. 범용 개발환경으로 개발된 이클립스 (Eclipse) 또는 비주얼 스튜디오 코드 (Visual Studio Code) 를 커스토마이징하여 사용하는 것도 좋은 대안이다.
○ 파이썬 파일 실행의 의미
abc.py 파일을 수정해 보았다. 아래의 abc.py 파일에는 3개의 선언이 포함되어 있다. 먼저 2개의 함수 hap( ) 과 average( ) 가 선언되어 있고, data 라는 변수가 하나 선언되어 있다.
위의 파이썬 파일을 %run 매직 명령어를 사용하여, 주피터 노트북에서 바로 실행할 수 있다. 그러면, 파일 내에서 함수의 정의이거나 변수의 선언이 아닌 명령어가 순차적으로 실행된다. 우리의 abc.py에서 명령어는 print( ) 문 밖에 없다. print( ) 문이 실행되면서 hap( ) 과 average( ) 가 호출이 이루어지는 형태로 만들어져 있다.
실제 %run 으로 실행한 후에 dir( )을 보면 abc.py 파일 내에서 선언되었던 average, data, hap 이란 이름이 리스트되어 있다. 무슨 얘기인가? 일단 abc.py를 주피터 노트북에서 실행하게 되면 실제 그 파일의 내용을 주피터 노트북의 셀에서 실행하는 것과 똑같은 효력을 가진다는 것이다.
실제로 abc.py 파일의 내용을 복사하여 주피터 노트북의 셀에서 실행했더니 %run 과 똑같은 결과를 나타내는 것을 확인할 수 있다. 아래의 그림을 참고하기 바란다.
* 조금 아쉽긴 하지만, 이것으로 소개를 마치겠습니다. 다음에 기회를 봐서 보완하도록 하겠습니다 *
'파이썬 (python)' 카테고리의 다른 글
[python 20] 알고리즘 연습 - 2 (0) | 2020.04.01 |
---|---|
[python 19] 알고리즘 연습 - 1 (0) | 2020.03.30 |
[python 17] 함수 - Part 3 : return (0) | 2020.03.25 |
[python 16] 함수 - Part 2 : 인자 (0) | 2020.03.25 |
[python 15] 함수 - Part 1 : 개요 (0) | 2020.03.25 |