(python-dev-environment)=
# Python 개발 환경 설정하기

이 예제에서는 연습 삼아 [Flask](https://flask.palletsprojects.com) 웹 프레임워크를 사용하여 Python 웹 애플리케이션을 만듭니다. 이 예제를 최대한 활용하려면 [선언적 셸 환경 정의하기](declarative-reproducible-envs)에 익숙해야 합니다.

`myapp.py`라는 새 파일을 만들고 다음 코드를 추가하십시오:

```{code-block} python myapp.py
#!/usr/bin/env python

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return {
        "message": "Hello, Nix!"
    }

def run():
    app.run(host="0.0.0.0", port=5000)

if __name__ == "__main__":
    run()
```

이것은 `"Hello, Nix!"`라는 메시지가 담긴 JSON 문서를 제공하는 간단한 Flask 애플리케이션입니다.

개발 환경을 선언하기 위해 새 파일 `shell.nix`를 만드십시오:

```{code-block} nix shell.nix
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-23.11") {} }:

pkgs.mkShellNoCC {
  packages = with pkgs; [
    (python3.withPackages (ps: [ ps.flask ]))
    curl
    jq
  ];
}
```

이것은 [`python3.withPackages`](https://nixos.org/manual/nixpkgs/stable/#python.withpackages-function)를 사용하여 `flask` 패키지를 포함한 `python3` 인스턴스가 있는 셸 환경을 기술합니다. 또한 웹 요청을 수행하는 유틸리티인 [`curl`]과 JSON 문서를 파싱하고 포맷하는 도구인 [`jq`]도 포함합니다.

[`curl`]: https://search.nixos.org/packages?show=curl
[`jq`]: https://search.nixos.org/packages?show=jq

둘 다 Python 패키지가 아닙니다. Python의 [virtualenv](https://virtualenv.pypa.io/en/latest/)를 사용했다면 추가적인 수동 작업 없이는 이러한 유틸리티를 개발 환경에 추가할 수 없었을 것입니다.

`nix-shell`을 실행하여 방금 선언한 환경에 진입하십시오:

```shell-session
$ nix-shell
these 2 derivations will be built:
  /nix/store/5yvz7zf8yzck6r9z4f1br9sh71vqkimk-builder.pl.drv
  /nix/store/aihgjkf856dbpjjqalgrdmxyyd8a5j2m-python3-3.9.13-env.drv
these 93 paths will be fetched (109.50 MiB download, 468.52 MiB unpacked):
  /nix/store/0xxjx37fcy2nl3yz6igmv4mag2a7giq6-glibc-2.33-123
  /nix/store/138azk9hs5a2yp3zzx6iy1vdwi9q26wv-hook
...

[nix-shell:~]$
```

이 셸 환경 안에서 웹 애플리케이션을 시작하십시오:

```shell-session
[nix-shell:~]$ python ./myapp.py
 * Serving Flask app 'myapp'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://192.168.1.100:5000
Press CTRL+C to quit
```

이제 Python 웹 애플리케이션이 실행되고 있습니다. 직접 해 보십시오.

새 터미널을 열어 셸 환경의 다른 세션을 시작하고 아래 명령을 따라 하십시오:

```shell-session
$ nix-shell

[nix-shell:~]$ curl 127.0.0.1:5000
{"message":"Hello, Nix!"}

[nix-shell:~]$ curl 127.0.0.1:5000 | jq '.message'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    26  100    26    0     0  13785      0 --:--:-- --:--:-- --:--:-- 26000
"Hello, Nix!"
```

보시다시피 별도의 수동 설치 없이 `curl`과 `jq`를 모두 사용하여 실행 중인 웹 애플리케이션을 테스트할 수 있습니다.

우리가 만든 파일을 버전 관리 시스템에 커밋하여 다른 사람과 공유할 수 있습니다. 이제 다른 사람도 [Nix가 설치되어](install-nix) 있기만 하면 동일한 셸 환경을 사용할 수 있습니다.

## 다음 단계

- [](packaging-tutorial)
- [](file-sets-tutorial)
- [](automatic-direnv)
- [](./dependency-management.md)
