pip 설치 중 컴파일 문제 회피를 위한 잡 기술

Python에서 어떤 패키지를 설치하려면 pip를 사용한다.

pip install <패키지>

이상적으로는 이렇게만 하면 편리하게도 pip가 PiPy에서 해당 패키지를 다운로드 해서 개발환경에 설치 해준다. 하지만 실제 pip 설치는 생각보다는 조금 복잡하다. 특히 macOS나 Linux 환경에서는 pip 설치가 기대치 않았던 C/C++ 컴파일 에러라는 새드 엔딩으로 치닫는 경우가 적지 않다.

이 포스팅에서는 pip에서 소스 코드 빌드를 회피하는 방법을 중심으로, pytubefix와 그 의존성인 nodejs-wheel-binaries 사례를 통해 설치를 실행하기 전에 실패를 예측하는 방법과 이를 최대한 회피하는 방법을 정리해 본다. 다만, 설명의 편의를 위해 local wheel 파일을 설치하는 경우는 제외하고 PiPy에서 다운로드 받는 패키지를 가정하고 설명 하였다.

pip 설치에는 두 가지 경우가 있다

pip가 패키지를 설치하는 방식은 크게 두 가지다.

pip install <패키지>
 ├─ wheel(.whl) 파일이 PiPy에 있음 -> 다운로드 후 설치
 └─ wheel 없음 -> 소스 코드 빌드

PiPy에 원하는 버전의 wheel 파일이 존재하면 이것을 다운로드해서 설치하는 것으로 설치 과정이 끝난다. 이것이 바로 앞에서 말한 “이상적인” 경우이다. 만약 wheel이 없으면 pip는 자동으로 소스 빌드를 시도하게 되는데 이렇게 되면 pip 설치 명령어의 성공 여부는 더이상 pip 자체의 문제가 아니라 다양한 변수들의 의존성에 달려있게 된다.

  • OS 버전
  • 컴파일러(clang, gcc)
  • 각종 SDK
  • 외부 라이브러리(OpenSSL 등)

만약 이 모든 요소가 잘 못 얽히게 되면, 복잡 다단한 원인에 의한 컴파일 문제로 결국은 pip 설치 명령어가 실패 할 수도 있다.

설치 전에 컴파일 가능성 판별하기

pip install 명령어의 –dry-run 옵션은 실제로는 설치를 진행하지 않고 모의 실행(Dry run) 해주는 명령어 인데, 이것을 이용하면 컴파일을 필요로 하는 상황인지의 여부를 미리 확인할 수 있다. macOS에서 Pytubefix 패키지를 설치하려는 경우를 예를들어 살펴보자.

pip install pytubefix --dry-run

전술한 대로 이 명령은 실제로 설치를 하지는 않지만, pip가 무엇을 설치하려고 하는지는 그대로 보여 준다. 출력 중에서 주의해서 봐야 할 부분은 다음이다.

이 메세지는 wheel 파일이 없어서 소스 코드 빌드가 시도 됨을 의미한다.

컴파일 회피 하기

컴파일이 항상 실패하는 것은 아니고, 문제가 발생한 경우에도 간단한 의존성 문제를 해결하는 것으로 해결하는 것도 가능하겠지만 때로는 모든 종속성을 해결해 줄 수 없어 차라리 오래된 버전이라도 미리 컴파일 되어 있는 wheel을 사용하고자 할 때도 있다. –only-binary option을 사용하면 설치가 가능한지 여부를 확인할 수 있는데, 다음과 같이 입력하면 직접 컴파일 하지 않고 whl을 다운로드 받아서 설치가 가능한지 여부를 확인할 수 있다.

pip install pytubefix --dry-run --only-binary=:all:

이 옵션은 컴파일 된 wheel이 있는 패키지들로 dry run을 실행해 보라는 의미이다. 성공하면 모든 의존성이 wheel로 제공된다. –only-binary option을 주지 않았을 때에 비해 낮은 버전이 제시된 것을 눈여겨보자. 소스코드 설치는 v24.13.0 이지만 바이너리 설치는 v22.20.0 이다.

만약 이 명령어에서 실패한다면 안타깝게도 의존성이 소스 빌드 없이는 설치가 불가능 함을 의미한다.

실제사례 – Pytubefix

Pytubefix는 YouTube clip를 다운로드 받을 수 있도록 해주던 PyTube가 더 이상 유지 관리가 되지 않으면서 이를 이어받아 진행되고 있는 오픈소스 프로젝트이다. Pytubefix가 Node.js 환경을 독립적으로 관리할 수 있게 해주는 도구인 nodejs-wheel-binaries에 의존 하는데, 문제는 이 모듈이 macOS 13 이상의 버전에 대해서만 wheel을 제공하고 있다는 점이다.

그래서 macOS Monterey(12) 환경에서 pytubefix 설치를 시도하면 지원되는 가장 최신의 nodejs-wheel-binaries 버전인 v24.13.0 소스코드 빌드를 시도하게 되고 이것이 OpenSSL의 deprecated API 때문에 컴파일에 실패하게 된다.

wheel 없음 -> 소스 빌드 -> nodejs-wheel-binaries 컴파일 -> OpenSSL deprecated API -> 컴파일 실패

nodejs-wheel-binaries란?

nodejs-wheel-binaries는 Node.js 런타임을 Python wheel 형태로 패키징한 라이브러리로 Node.js 실행 파일을 Python 가상환경 내부에 포함시켜 pip install만으로 Node.js를 사용할 수 있게 만들어 준다. pytubefix는 YouTube 대응 로직 일부를 JavaScript 기반 코드로 처리하기 때문에 내부적으로 Node.js 실행을 필요로 하기 때문이 이 패키지에 의존한다. 주의할 점은 시스템에 설치한 Node.js의 버전은 이 동작과는 무관하다는 점이다. 즉, 시스템에 Node.js가 설치되어 있다 하더라도, 의존성이 있는 경우에는 이 패키지의 설치가 필요하다.

결론: 소스 빌드를 회피하는 현실적인 해결책

Pytubefix를 위해서는 반드시 최신버전의 nodejs-wheel-binaries 패키지를 사용하지는 않아도 된다. 위에서 pip 명령어로 wheel 파일이 지원되는 것으로 확인한 v22.20.0을 다음의 명령어로 먼저 설치하고 그 위에 pytubefix의 설치를 실행할 수 있다.

pip install "nodejs-wheel-binaries==22.20.0" pytubefix

macOS 설치 후 개발환경을 위한 설정

1. Xcode 와 Xcode Command Line Tools 설치

Xcode Command Line Tools에는 컴파일러등의 도구가 들어 있어서 다른 설정들과 관계가 있어 가장 먼저 설치 해준다. Xcode는 App Store에서 설치하면 되고, Xcode Command Line Tools는 아래의 명령어를 터미널에서 실행한다.

xcode-select --install

2. 패키지 관리자 설치

개발등에 필요한 여러가지 도구들을 설치하려면 Macports 혹은 Homebrew와 같은 패키지 관리자를 설치해 주어야 한다. 2026년 현재 Homebrew는 Sonoma(14)이상에서만 동작 하므로 그보다 이전 버전을 사용하고 있다면 Macports가 선택가능한 대안이다.

3. zshell용 extension 설치

macOS terminal을 실행 할 때 기본적으로 zsh가 실행되는데, Oh my zsh 혹은 zim:fw 같은 extension을 사용하면 명령어 오타감지 등의 다양한 기능을 추가 하거나 보기 좋은 테마를 적용할 수 있다.

나는 기능은 적지만 단순한 zim:fw를 선호하는데, 만약 설치 후 사용할 때 “zsh: command not found: prompt-pwd” 라는 보기 싫은 경고 문구가 매번 출력된다면 ~/.zimrc 파일에 다음과 같이 prompt-pwd module을 추가해 서 해결할 수 있다.

4. 메타키 변경 (Emacs)

기본적인 터미널 설정의 메타(Meta) 키는 ESC이다. 이 키를 자주사용하는 Emacs 사용자라면 멀리 떨어져 있는 ESC 키를 누르는게 무척 귀찮을 것이다. Terminal을 열어서 “Use Option as Meta key”를 활성화 해 주면 ESC 대신 Option key로 대체할 수 있다.

한가지 주의할 점은 이 설정은 각 프로필 마다 따로 해주어야 한다는 점이다. 따라서 다른 종류의 프로필 여러개를 사용한다면 각각에 위의 설정을 적용해 주어야 한다.

5. Caps lock key를 Ctrl로 변경

Mac용 한글 키보드에서는 한영전환으로 사용되는 Caps lock key의 위치는 손목이 편안한 명당 이지만 자주 사용되지 않는 키를 배치하는 용도로 사용하면 효율이 나쁘다. HHKB 처럼 Caps lock을 Ctrl로 변경하면 손이 편하게 작업할 수 있다. 그리고 나서 Caps lock은 변방인 Ctrl 위치로 밀어 낸다.

Settings -> Keyboard -> Modifier Keys

6. 한글입력과 spotlight 단축키 변경

기본 한글 입력기 변환은 Ctrl + space인데 HHKB나 레오폴드 키보드 처럼 Ctrl 키의 위치가 Caps Lock을 대체하는 경우에는 한영 변환 입력이 조금 어렵다. 그래서 Settings -> Keyboard -> Shortcuts에서 Command + space로 변경해주고 이 때문에 충돌이 생기는 spotlight을 옛날 버전의 MacOS에서 쓰던 Command + p로 변경해 주었다.

Shift + Command + p는 VS code의 명령어 팔레트 단축키와 충돌 하므로 spotlight설정 할 때 함께 보이는 “Show Finder search window”는 단축키를 설정하지 않았다.

7. 기타 설정

  • SSH key를 복사하고 config를 설정
  • GitHub에 올려두는 Emacs 환경 파일을 clone
  • 터치바에서 siri을 없애고 Screenshot 기능으로 대체

Raspberry Pi Debugprobe Firmware Update

Warn : ***
Warn : *** Old Raspberry Pi Debugprobe firmware detected (1.0.1)
Warn : *** Using low-performance workaround
Warn : *** Please update to the latest release at:
Warn : *** https://github.com/raspberrypi/debugprobe/releases/latest
Warn : ***

Debugprobe의 firmware가 오래되어서 low-performance workaround로 동작한다는 경고메세지가 발생할 때는 firmware의 버전을 업데이트 해주는 것으로 해결할 수 있다.

  • Debugprobe realease page에서 최신 버전의 debugprobe.uf2 file을 다운로드 받는다.
  • Debugprobe hardware에도 BOOTSEL 버튼이 있는데 이것을 누른채로 USB를 연결하면 디스크가 마운트된다.
  • 다운로드 받은 debugprobe.uf2 file을 복사하면 완료된 후 최신 firmware로 재실행된다.