해당 글은 2022년 상반기 기준 업데이트를 기반으로 하고 있으며, 회고록 형태로 작성됩니다.
현재의 이슈와는 사뭇 다를 수 있으니, 이점 유의하시길 바랍니다.
conda 4.12.0에서
Python에서 GUI 응용 프로그램을 만들기 위해서 PyQT 프레임워크를 사용하여 개발하는 중에 있었던 일입니다.
유튜브 영상을 크롤링해서 UI 안에서 보여주기 위해서 오픈소스 미디어 플레이어인 vlc를 사용했습니다.
유튜브 영상을 불러오는 방식으로는 당시에는 pafy를 사용하였습니다.
해당 글 참고 다음과 같은 과정을 겪으면, 윈도우기반의 데스크탑이나 랩탑에서는 잘 동작하는 것으로 확인됐습니다.
import pafy
import vlc
class VideoPageLogic(QObject,threading.Thread):
.
.
.
.
python-vlc를 설치해 import vlc를 하기 위해선 vlc를 설치해야 하는데,
당시에도 사용중인 맥북은 M1이었고, apple silicon version을 다운로드 받았던 것으로 기억합니다.
받아서 import해서 사용하면 다음과 같은 에러가 발생합니다.
왜 안될까요?
이미 이와동일한 문제를 겪은 사람들이 있습니다.
겪은사람1
겪은사람2
오류 메시지를 보면, architecture의 문제로 보입니다.
arm64와, x86_64이 매치되지 않는 문제로부터 발생하는 것으로 보입니다.
확실한 것은 arm64가 제가사용한 macbook의 아키텍쳐이고,
(M1칩의 아키텍쳐는 intel과는 근본적으로 다르다는 것도 알면 이해가 빠름 ex: RISC, CISC 등)
이에 대한 파일을 제가 가지고 있으니 옳게 다운 받은 것으로 생각할 수 있습니다.
{아래에 (apple silicon native vlc 응용프로그래밍 실행) = (arm64) 을 증명하는 사진이 있음}
일단 원인에 대한것은 아래에서 생각하고, 어떻게 해결해야할까요...?
윈도우 파일은 파일 타입 자체가 맥북에서 사용이 불가하니, intel Mac 전용 프로그램을 다운받아봅시다.
근데, 이론적으로는 다른 아키텍쳐로 설계된 프로그램을 사용하면 구동 자체가 불가능할텐데... 일단 해봅시다.
인텔 맥북 전용 프로그램(일반 macbook으로 적힌 것)을 받아서 실행해보면, 몇가지 이슈가 발생하긴 하지만(작성일 기준), 성공적으로 실행됨을 볼 수 있습니다.
동작하는 모습(사진)입니다.
그런데, 왜 안되고 인텔 맥용 프로그램만 됐을까요?
vlc를 응용프로그램으로 사용하는 것과, import해서 사용하는 것의 차이가 발생하는 것 같습니다.
공식 홈페이지에 따르면
Apple Silicon이 탑재된 Mac은 Rosetta 2라는 변환 메커니즘을 사용하여 x86_64 명령 세트에 대해 컴파일된 코드를 실행할 수 있습니다.
그렇다면, 저희가 설치한 intel Mac용 vlc(다른 아키텍쳐용 프로그램)를 import해서 python에서 사용할 수 있었던 까닭은
해당 방식으로 변환하여 실행한 것으로 추측이 가능합니다.
왜 apple silicon 버전 응용 프로그램은 안되는가?
이 부분은 불확실합니다. 그런데 intel 버전과, apple silicon 버전 모두 응용 프로그래밍만으로 사용하면 실행이 가능한 것을 다시 살펴봅시다.
양 버전의 응용프로그래밍 구동 방식을 확인해봤는데, 각각 로제타(에뮬레이팅), 실리콘(네이티브)으로 동작합니다.
프로그래밍을 잘못한 경우
일단 코드 자체의 동작이 간단하기도 하고, 만약 제가 설치한 파일을 뜯어 고쳐야 한다면, 그것은 프로그래밍을 잘못한 경우라 보기 어렵습니다.
intel로 갈아끼우니 제대로 동작하기도 했구요.
vlc에서 import로 사용되는 것(python-vlc)을 고려하여 패치가 되지 않은 경우
해당 아이디어는 '파일을 아예 건드리지 않았다'가 아니라, 응용 프로그래밍을 건드는 과정에서 import로 사용되는 모듈이 동작하지 않게 패치가 됐다가 맞는 표현인것 같습니다.
만약 아예 건들지 않았다면, x86_64로 남아있을 것이고, 동작에는 문제가 없었을 것입니다.
하지만 apple silicon용 응용프로그래밍을 만드는 과정(기존것을 고치던, 새로 만들던)에서 해당 부분이 기존 인텔용의 그것과 동일하지 않다는 것이 확실하고(이것도 바뀐 것인지 사라진 지는 모름),
그 결과는 M1에서의 import가 가능하지 않게 했다고 유추할 수 있습니다.
필력이 떨어져 놓친게 있을 수 있는데, 생각나면 글 수정하도록 하겠습니다.
읽어주셔서 감사합니다.