사용자는 웹브라우저를 통해 셀(cell)이라고 불리는 칸에 텍스트나 코드를 입력한다. 이것을 실행하도록 하면, 셀의 있는 내용이 커널(kernel)로 옮겨서 커널 내에서 실행된다. 이 커널(kernel)은 코드를 실행하는 엔진이라고 생각하면 된다. 실행 결과는 다시 서버를 거쳐 사용자의 웹브라우저로 돌아와 셀 아래에 출력된다.
3.2 주피터 노트북 시작하기
섹션 2.5에서 가상 환경에 주피터 노트북을 설치하고, 시작하는 방법에 대해서 설명했다. 다시 살펴보자.
나는 주피터 노트북/주피터랩을 실행할 때 두 가지 방법 가운데 하나를 선택한다.
명령행에서 시작하여 전통적인 주피터 노트북 또는 주피터랩을 사용하는 경우
VS Code 안에서 주피터 노트북을 사용하는 경우
위 두 방법의 큰 차이는 파이썬 커널(또는 다른 언어)을 선택하는 방식일 것이다.
3.2.1 명령행에서 시작하여 전통적인 주피터 노트북 또는 주피터랩을 사용하는 경우
작업할 프로젝트(디렉터리)에서 명령행 인터페이스(아나콘다 프롬프트)를 연다.
가상 환경을 활성화한다.이 가상 환경에서는 주피터 노트북이 설치되어 있어야 할 것이다.
다음 명령으로 주피터 노트북을 시작한다. 주피터랩을 사용하려면 jupyter lab을 입력하고, 전통적인 주피터 노트북을 사용하려면 jupyter notebook을 입력한다. 아래 $는 프롬프트이다(이것은 입력하지 않는다).
이 경우에는 가상 환경을 활성하고, 작업 디렉터리에 가서 노트북을 실행하고 있다. 그래서 사용할 파이썬 커널 및 작업 디렉터리를 선택하고 시작하는 셈이다.
그림 3.3: 주피터랩 시작 화면(런처)
내 컴퓨터에는 파이썬이외에도 여러 언어에 대한 커널이 설치되어 있다. Deno(JavaScript), R 커널, Rust 커널, SageMath 커널 등이 설치되어 있기 때문에 그림 3.3에서 보는 것처럼 커널들이 보이는 것이다. 다른 언어에 대한 커널을 뒤에서 설명한다.
그림 3.3의 런처에서 노트북 섹션에서 보이는 Python 3을 선택하여 새로운 노트북 파일을 만든다. 그림 3.4에서 보는 것처럼 새로운 노트북 파일이 생성된다.
그림 3.4: 새로운 노트북 파일 생성
3.2.2 VS Code 안에서 주피터 노트북을 사용하는 경우
VS Code 안에서는 보통 다음과 같은 방법으로 주피터 노트북을 사용한다. 섹션 2.5.5 등에서 설명한 파이썬, 주피터 사용을 위한 익스텐션 등이 모두 설치되었다고 가정한다.
프로젝트 디렉터리에서 VS Code를 실행한다. 다음 세 가지 방법 중 하나를 선택한다.
명령행 인터페이스에서 code .
파일 탐색기에서 프로젝트 디렉터리에서 마우스 오른쪽 버튼을 클릭하여 Open with Code를 선택한다.
또는 VS Code 실행시킨 다음 작업 디렉터리를 연다.
커맨드 팔렉트에서 “Create: New Jupyter Notebook”을 입력하여 새로운 주피터 노트북 파일을 만든다. 그러면 새로운 주피터 노트북 파일이 생성된다(그림 3.5).
파일을 저장하고 사용할 커널을 선택한다.
그림 3.5: VS Code 커널 선택
VS Code는 커널을 다양하게 선택할 수 있도록 해준다. 그림 3.6에서 보듯이 파이썬 환경, 주피터 커널, 코드스페이스 등 다양한 방식으로 커널을 선택할 수 있다.
그림 3.6: VS Code 커널 선택
이처럼 VS Code를 사용할 때는 주피터 노트북 파일을 먼저 시작하고 커널을 선택하는 것이 일반적이다.
아래 설명할 내용들은 전통적인 주피터노트북/주피터랩은 물론이고 VS Code 안에서 주피터 노트북을 사용할 때도 모두 적용된다. 즉 노트북 파일 안에서 작업할 때의 기능은 거의 동일하다고 보면 된다.
3.3 주피터 노트북 셀 사용법
엑셀에서 셀에 내용을 입력하는 것과 비슷하게 주피터에서 사용자는 셀(cell)에 코드 또는 텍스트 등을 입력하여 노트북 파일을 작성하게 된다.
3.3.1 셀의 종류
주피터 노트북 셀에는 세 가지 종류가 있다. 셀의 종류는 사용자가 선택할 수도 있고, 셀을 종류를 바꿀 수도 있다.
코드 셀(Code cell)
코드를 입력하는 셀이다. 셀에 입력된 코드는 연결된 커널로 보내져서 실행되고, 그 결과는 해당 셀 바로 아래에 출력된다. 코드 셀은 앞 부분에 In []:이 표시되어 있다. 코드가 실행된 경우 [] 안에 번호가 부여된다. 번호가 없다면 아직 실행된 코드가 아니다.
마크다운 셀(Markdown cell)
마크다운(Markdown)을 사용하여 텍스트를 입력하는 셀이다. 마크다운 셀 앞에는 아무것도 보이지 않는다.
라우 셀(Raw cell)
라우 셀(Raw Cell)은 결과를 직접 입력하는 셀이다. 이 셀은 자주 사용되지는 않는다.
3.3.2 셀 모드(cell mode)
새로운 노트북 파일을 시작했을 때, 커서가 어디에 있는지에 따라서 편집 모드와 명령 모드로 나뉜다. 노트북을 효율적으로 쓰려면 이 모드를 자유자재로 활용할 수 있도록 몸에 배도록 연습하는 것이 좋다.
편집 모드(Edit mode): 커서가 셀 안에 있는 상태이다. 명령 모드에서 Enter 키를 입력하면 편집 모드로 바뀐다.
명령 모드(Command mode): 셀의 종류를 바꾸거나 삭제하는 등의 명령을 실행할 수 있는 상태이다. 이 상태에서는 셀 앞에 파란색 바가 생성된다. 편집 모드(커서가 셀 안에 있는 경우)에서 ESC 키를 입력하면 명령 모드로 바뀐다.
그리고 편집 모드에서 ESC 키를 입력하면 명령 모드로 바뀌고, 명령 모드에서 Enter 키를 입력하면 편집 모드로 바뀐다(그림 3.8).
그림 3.8: 모드 변경: ESC키와 Enter키를 사용하여 모드 변경
편집 모드에서는 코드나 텍스트를 입력하여 실행한다.
명령 모드는 셀과 연관된 어떤 명령을 사용할 수 있는 상태라는 의미이다. 명령은 키보드를 사용하여 준다.
키보드 A를 입력하면 현재 셀의 위에(above)에 셀이 추가된다.
B를 입력하면 아래에(below) 셀이 추가된다.
DD라고 D를 2번 입력하면 해당 셀이 삭제된다.
명령 모드에서 M을 입력하면 마크다운 셀로 변경되고, Y를 입력하면 코드 셀로 바뀐다.
C를 입력하면 해당 셀이 복사되고, 다른 곳으로 이동한 다음 V를 입력하면 복사된 셀이 붙여진다.
명령 모드에서 Shift 키를 누르고 있는 상태에서 인근 셀들을 클릭하면 복수의 셀들을 선택할 수 있다. 그런 다음 위의 명령들, D을 입력하여 삭제할 수도 있다.
코드 실행 또는 마크다운 셀 렌더링을 위한 단축키는 다음과 같다. 실행시킬 셀에 커서를 놓고 다음 단축키를 사용한다.
Ctrl(맥에서는 Command) + Enter: 코드만 실행
Shift + Enter: 코드 실행 후 다음 셀로 이동. 다음 셀의 명령 모드에 놓임.
Alt(맥에서는 Option) + Enter: 코드 실행 후 다음 셀로 이동. 다음 셀의 편집 모드에 놓임.
3.3.3 셀 코드 실행 결과 출력
주피터 노트북에서 코드 셀에 입력한 코드를 위와 같은 방법들 가운데 하나를 사용하여 실행하면 코드가 실행되고, 그 결과는 셀 바로 아래에 출력된다(그림 3.9). 그리고 꼭 print() 함수를 사용하지 않아도 그 표현식의 결과가 출력된다.
그림 3.9: 코드 실행 결과 출력
또 알아두어야 하는 것은 하나의 코드 셀에서 여러 출력이 있을 때, 출력 결과가 모두 출력되는 것이 아니라 마지막 표현식의 결과만 출력된다는 점이다(그림 3.10).1
그림 3.10: 마지막 표현식만 출력된다
그래서, 하나의 코드 셀에서 결과들을 출력하려면 print() 함수들을 사용하여 출력해야 한다.
그림 3.11: 여러 개의 출력 결과를 출력하려면 print() 함수들을 사용하여 출력해야 한다.
3.3.4 셀의 이동, 분리, 머징, 복사, 삭제 등
이동: 셀(들)을 위, 아래로 드래그 하여 이동시킬 수 있다. 명령 모드에서 Shift 키를 누르고 주변 셀들을 클릭하여 복수의 셀들을 선택할 수 있다. 이후 드래그하여 필요한 위치로 이동시킬 수 있다.
분리, 머징, 복사 & 붙이기 등: 명령 모드나 편집 모드에서 오른쪽 마우스 버튼을 클릭하면 다양한 작업을 할 수 있는 메뉴가 표시된다. 전통적인 주피터 노트북/주피터랩과 VS Code에도 모두 동일하다.
그림 3.12: 셀 편집 메뉴(주피터랩)
그림 3.13: 셀 편집 메뉴(VS Code)
3.4 코드 셀들의 실행 순서
분석 작업을 하다 보면, 하나의 노트북 파일에는 여러 개의 코드 셀들이 놓이게 될 것이다. 주피터 노트북에 있는 코드 셀은 여러 번 실행시킬 수도 있다. 1번 셀을 실행시키고, 5번 셀을 실행시키고, 2번 셀을 실행시킬 수도 있고, 다시 1번 셀을 실행시킬 수도 있다. 그런 다음 5번 셀을 삭제할 수도 있다. 이런 식으로 작업하다 보면 파이썬 프로그램의 상태가 눈에 보이지 않을 수도 있어서 프로그래밍 관점에서 보면 문제가 될 수 있다.
주피터는 사용자 마음대로 이런 일들을 할 수 있는 융통성을 주는 반면 주의를 기울이지 않으면 예상하지 못한 결과에 당황할 수 있다. 주피터 노트북을 사용할 때 정말로 주의를 해야 하는 부분이다.
그래서 주피터 노트북에서 가끔은 커널을 다시 시작시켜서 처음부터 다시 실행시키는 과정이 필요할 수도 있다. 주피터랩에서는 그림 3.14에서 보는 것처럼 커널을 다시 시작하여 위에서 아래로 코드를 순차적으로 실행할 수 있다. VS Code에도 이와 같은 기능이 있다.
그림 3.14: 커널을 다시 시작하여 위에서 아래로 코드를 순차적으로 실행
이런 주피터의 단점을 극복하기 위한 새로운 노트북을 만드는 사람들도 있다. 마리모(Marimo)라는 노트북이 대표적이다.
그림 3.15: 마리모 노트북
3.5 IPython 매직 명령
한때 Jupyter Notebook은 IPython Notebook으로 불렸다. 실제로 IPython 프로젝트가 나중에 여러 기능들이 추가되면서 Jupyter 프로젝트가 되었다. 여기서 그 역사를 설명하려고 하는 것은 아니지만, 약간 알고 나면 Jupyter 시스템을 이해하는 데 도움이 된다.
초기 IPython 프로젝트는 파이썬 REPL(Read-Eval-Print Loop) 환경을 확장하는 것이 목표였다. 요즘 기준으로 보면 명령행 인터페이스(아나콘다 프롬프트 또는 터미널)에서 단순히 python 명령으로 실행되는 파이썬 REPL 기능을 확장하는 것이 목표였다.
그림 3.16: 파이썬 REPL 환경
요즘에는 Jupyter나 VS Code 같은 통합걔발환경에서 터미털, 파일시스템, 그래픽창 등에 바로 접근할 수 없었던 당시에는 이런 작업을 하려면 파이썬 REPL을 종료하여 빠져 나왔어야 했다. 당시 이런 불편함을 줄이기 위해 파이썬 REPL 안에 이런 기능을 추가하여, 이를 IPython이라고 하였다(그림 3.17). I는 Iron(강한)이라는 뜻이다.
그림 3.17: IPython 파이썬 REPL 환경
ipython REPL 환경에서는 프롬프트가 주피터 노트북과 것의 비슷하다. 모양만 비슷한 것이 아니라 주피터 노트북의 디폴트 커널은 이 ipython 기능을 바탕을 둔 ipykernel이다. 그래서 그림 3.3에서 보는 것처럼 파이썬 커널이 Python 3(ipykernel)이라고 표시된다.
그리고 웹에서 Jupyter Notebook 사이트를 찾아봐도 여기서 설명하려고 하는 IPython 매직 명령에 대한 자룔 찾기 어렵다. IPython Documentation에서 별도로 찾아야 한다. 이처럼 Jupyter Notebook은 IPython과 깊이 연관되어 있기도 하고 독립적인 프로젝트이기도 하다. 그래서 다음은 꼭 기억할 필요가 있다.
주피터 노트북의 파이썬 디폴트 커널은 ipython의 기능을 옮겨놓은 ipykernel이다.
주피터 노트북은 뒤에서 설명하겠지만 다른 커널과 연결하여 실행시킬 수도 있다. 이런 경우에는 그 커널이 ipykernel이 아니기 때문에서 ipython의 기능을 그 커널이 별도로 제공하지 않는한 사용할 수 없다. 여기서 설명할 매직 명령은 주피터 노트북의 파이썬 디폴트 커널인 ipykernel에서 사용할 수 있는 매직 명령이다.
3.5.1ipykernel 매직 명령의 종류
매직 명령은 % 기호로 시작하는 명령인데, 하나이면 라인 매직(line magic)이고, 두 개이면 셀 매직(cell magic)이다. 라인 명령은 셀 안에 있는 코드 라인에 적용되는 명령이고, 셀 명령은 셀 안에 있는 모든 코드에 적용되는 명령이다.
명령이 많이 있지만 오늘날 통합개발환경에서는 이것들을 대체하는 방법들이 많이 개발되어 있다. 그래도 여전히 자주 사용되는 매직 명령들이 있다. 실행 시간을 측정하는 %time, %timeit 등도 그 가운데 하나이다.
3.6 마크다운 셀 사용하기
마크다운 셀은 주피터 노트북에서 텍스트를 입력하는 셀이다. 주피터 노트북 메뉴를 사용하거나, 명령 모드에서 M 키를 입력하여 셀의 종류를 마크다운으로 바꿀 수 있다. 마크다운 셀은 주로 노트북에 설명, 제목, 목록, 일반 텍스트 등을 추가하는 데 사용된다.
그림 3.18: 마크다운 셀의 사용: 마크다운 셀로 바뀌면 셀 앞의 [번호]가 보이지 않게 된다.
마크다운(Markdown)은 텍스트를 서식화하는 간단한 방법으로, 주로 문서화에 사용된다. 마크다운 셀을 사용하여 노트북에 설명, 제목, 목록 등을 추가할 수 있다. 사용법은 코드 셀과 다름이 없다. 마크아운 셀에 텍스트를 입력하고, 셀을 실행하면(Ctrl + Enter 또는 Shift + Enter, Alt + Enter 등) 셀 안에 있는 마크다운 텍스트가 HTML로 렌더링되어서 해당 셀 위치에 표시된다.
마크다운은 HTML 태그를 사용하지 않고 간단한 문법으로 텍스트를 서식화 하는 방법이다. 그렇게 서식화된 텍스트는 HTML로 변환되어 웹 브라우저에서 표시된다. 마크다운은 간단한 문법으로 작성할 수 있어서, 프로그래밍 언어를 모르는 사람도 쉽게 사용할 수 있다.
웹에는 마크다운 문법과 같이 문법을 설명하는 사이트가 많이 있기 때문에 더이상 자세히 설명하지 않는다.
3.7 IPython 리치 아웃풋(Rich Output)
주피터 노트북은 IPython의 리치 아웃풋(Rich Output) 기능을 지원한다. 이 기능은 코드 실행 결과를 단순한 텍스트 출력이 아니라, HTML, 이미지, 그래프 등 다양한 형식으로 표시할 수 있게 해주는 기능을 말한다.
제목을 Jupyter Rich Output이라고 하지 않은 이유는 앞에서 매직 명령을 설명할 때와 마찬가지로, Jupyter 노트북의 파이썬 디폴트 커널인 ipykernel에서 제공하는 기능이기 때문이다. 그래서 IPython Rich Output이라고 제목을 붙였다. 그림 3.19에 이 시스템의 역할을 간단히 정리해 보았다.
그림 3.19: IPython 리치 아웃풋의 이해
주피터 노트북은 프로그램 개념으로 보면 가장 안쪽에 커널로 표시되는 파이썬의 세계가 있다. 코드를 실행하면 커널에서 실행되고 그 결과가 다시 브라우저로 돌아와 출력된다. 이때 커널에서 실행된 결과가 단순한 텍스트가 아닌 경우에는 좀 더 특별한 처리가 필요할 수 있다. 예를 들어, 그래프를 그리거나, HTML로 렌더링된 텍스트를 표시하거나, 이미지 파일을 표시하는 등의 작업이 필요할 수 있다.
이런 작업을 위해 IPython.display 모듈이 존재한다. 이 모듈에는 Image(), HTML(), Markdown(), display() 등의 함수가 있고, 이것들을 해당 결과물을 표현하고, 이것을 display() 함수에 전달하면 브라우저에서 해당 결과물을 표시할 수 있다.
이것은 파이썬 코드를 통해서 다이내믹하게 결과물을 만들고 이를 표시할 때 유용하다. 그림 3.20에서 보는 것처럼, IPython.display 모듈을 사용하여 다양한 형식의 결과물을 표시할 수 있다. 이것은 모두 파이썬 코드이기 때문에 코드 셀에서 실행되어야 한다.
이 커널의 디폴트 이름은 ir(kernel name)이며, 주피터 노트북에서는 R(display name)이라고 표시된다.
이것을 설치하고 나서 커널을 확인해 보자. 컴퓨터에서 주피터 커널을 확인하는 방법은 명령행(터미널)에서 다음 명령을 입력한다.
jupyter kernelspec list
그리고 주피터 노트북/주피터랩을 실행해 보면, 그림 3.21에서 보는 것처럼 R 커널을 선택할 수 있다.
그림 3.21: 주피터랩 런처에서 보이는 R 커널(내 컴퓨터에서는 다른 언어들에 대한 커널도 설치되어 있어서 이렇게 보이는 것이다.)
3.9 구글 코랩(Colab)
구글 코랩(Colab)은 구글이 제공하는 클라우드 기반의 Jupyter 노트북 환경이다. 사용자는 구글 계정으로 로그인하여 노트북을 작성하고 실행할 수 있다. 구글 코랩은 무료로 제공되며, 유료인 경우 GPU 및 TPU를 사용할 수 있는 기능도 제공한다. 구글 사용자인 경우 구글 드라이브에 노트북을 저장할 수 있고, 다른 사람과 공유할 수도 있다.
별도의 셋업 없이 웹 브라우저에서 바로 사용할 수 있기 때문에, Jupyter 노트북을 처음 사용하는 사람들에게도 매우 유용하다. 그러나, 보안이 필요한 작업이나 개인 정보가 포함된 작업에는 주의가 필요하다. 구글 코랩은 구글의 서버에서 실행되기 때문에, 사용자의 데이터가 구글 서버에 저장되고 처리된다. 주피터 노트북을 사용할 줄 안다면 구글 코랩을 사용하는 데 전혀 문제가 없을 것이다.