Pip에 최근에 lock 커맨드가 추가됐다. requests를 기준으로 실행하면 pylock.toml이라는
파일이 생긴다.
$ pip lock requests -o pylock.toml
현재 기준으로 poetry, pipenv, uv 등.. 각 툴마다 서로 다른 lock 파일을 만들어서 사용하고 있고, 서로 스펙이 다르다 보니 도구 사이에 호환성은 보장되지 않았다 (왜냐면 스펙 표준이 없기 때문에).
작년에 PEP 751이 채택되어 lock 파일 표준이 생겼고,1 pip에는 4월에 pylock.toml 지원이 실험적으로 추가됐다. 다른 도구도 점차 해당 표준을 지원하지 않을까 한다. 참고로 uv는 이미 지원하고 있다.
도구마다 다른 lock 파일
lock 파일은 패키지 버전뿐만 아니라 실제 설치할 파일의 해시를 같이 기록하여, 같은 조건에서 일관된 패키지를 설치할 수 있게 하는 역할을 한다.
Pip에서는 requirements.txt가 그 역할을 거의 표준처럼 하고 있는데
(pip install -r requirements.txt..), 이게 lock 파일처럼 버전이나 설치할 파일을
엄격하게 고정하는 형식은 아니다 보니, 사용하는 방식에 따라 설치 결과가 달라질
가능성이 있다.
다른 패키지 도구들은 각각 lock 파일 스펙을 만들어서 사용하고 있는데, 형식이 서로 다르다 보니 Dependabot 같은 의존성을 파싱해서 검사해야 하는 도구를 개발할 때 여러 lock 형식을 지원해야 하는 귀찮은 상황이 발생한다. 그래서 lock 파일 형식이 서로 달라 발생하는 유지보수 비용을 줄이기 위해 PEP 751이 채택된 것으로 보인다.
pylock.toml의 구조
위에서 만든 pylock.toml에는 requests와 requests가 의존하는 하위 의존성들이
작성되어 있다. 일부만 발췌하면 아래와 같다.
lock-version = "1.0"
created-by = "pip"
[[packages]]
name = "certifi"
version = "2026.6.17"
[[packages.wheels]]
name = "certifi-2026.6.17-py3-none-any.whl"
url = "https://files.pythonhosted.org/packages/.../certifi-2026.6.17-py3-none-any.whl"
[packages.wheels.hashes]
sha256 = "2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db"
[[packages]]
name = "requests"
version = "2.34.2"
[[packages.wheels]]
name = "requests-2.34.2-py3-none-any.whl"
url = "https://files.pythonhosted.org/packages/.../requests-2.34.2-py3-none-any.whl"
[packages.wheels.hashes]
sha256 = "2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0"
보통 버전을 고정한 requirements 파일은 패키지==버전 구조지만, 위 구조를 보면 버전
이외에도 실제 설치할 파일과 해시까지 포함되어 있다 (pylock.toml의 자세한 스펙이 궁금하다면
문서 참고).
현재 pip의 구현
PEP 751은 채택된 상태지만, pip의 pip lock과 -r pylock.toml 지원은 아직
실험적인 단계다. PEP 명세를 pip가 어떻게 기능으로 구현할지는 아직 변경될 여지가
있다 (즉 아직은 프로덕션에서 사용하는 걸 지양해야 한다).
현재 구현된 기능의 한계점과 논의는 pip lock 이슈와
-r pylock.toml 이슈에서 논의되고
있어서, 만약 해당 기능을 사용하다가 뭔가 개선점이 보인다면 이슈로 제보해 보면
좋을 것 같다.
참고
- PEP 751: A file format to record Python dependencies for installation reproducibility
- pylock.toml 명세 (PyPA specs)
- pip 문서,
pip lock - What’s next for
pip lock? (pypa/pip#13953) - What’s next for
-r pylock.toml? (pypa/pip#13952)