Playonlinux는 여기 블로그에서 자주 소개한 프로그램입니다.

다만 요즘은 Lutris나 다른 프로그램으로 많이 대체하고 있습니다.

 

문제는 저는 이미 Playonlinux가 많이 편하다는겁니다... 그리고 이미 사용중인 프로그램도 꽤 많고요. lutris로 실행이 가능하긴하지만 lutris를 또 설치하기도 귀찮기도 합니다.

 

아무튼.. playonlinux의 호환성 문제를 해결하려고 했던 기록을 남깁니다.

 

우선. Anaconda3와의 문제입니다.

 

Anaconda3를 설치하면 저는 기본적으로 conda init을 하게끔 옵션을 줍니다. 

앞에 요렇게 (base)가 뜨게 해서 필요할때마다 바로 conda activate (사용자환경) 이렇게 쓸수있게 해놓습니다.

 

문제는... 이게 Playonlinux에서 사용하는 Python이랑 충돌이 난다는겁니다. 기본 Anaconda의 Base 파이썬과 시스템에 설치된 Python은 서로 다르기 때문에 문제를 펑펑 일으킵니다.

 

기본적으로 Anaconda를 설치하면서 만들어진 파이썬에서 wx가 없기에 이를 설치하도록 유도합니다만...

Anaconda에서 제공하는 wx는 지금 시스템에 설치된 cairo와 호환성 문제를 일으킵니다. cairo나 기타등등조차 anaconda에서 제공한걸로 때우면 될 수도 있습니다만... 이건 이것대로 일일이 귀찮아지는 문제를 일으킵니다.

 

그래서 Playonlinux를 실행시에 deactivate 하도록 만들어야 합니다.

 

우선 Anaconda 실행시 바로 conda가 실행 가능한 이유는 .bashrc에 이런 코드가 추가되기 때문입니다.

 

anaconda가 설치된 곳의 bin을 우선시 해서 PATH설정을 해서 python이란 명령을 내리면 (anaconda가 설치된 곳)/bin/python을 실행하도록 하는 겁니다. 즉, 해당 위치의 PATH를 삭제해 버리면 다시 python명령은 시스템에 설정된 python으로 다시 돌아온다는 의미가 됩니다.

 

그래서 playonlinux 스크립트의 일부를 수정합니다.

sudo nano /usr/share/playonlinux/playonlinux

혹은

sudo gedit /usr/share/playonlinux/playonlinux

sudo mousepad /usr/share/playonlinux/playonlinux

 

 등등으로 편한 텍스트 에디터를 관리자권한으로 /usr/share/playonlinux/playonlinux 파일을 엽니다.

 

그러면 특유의 Playonlinux의 4잎클로버 로고가 보이게 되고 이 아래에 다음과 같이 적습니다.

 

export PATH=$(REMOVE_PART="아나콘다가 설치된곳/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')

 

"아나콘다가 설치된곳/bin"

이게 어딘지 모른다면 ~/.bashrc 파일을 열고

export PATH= "(여기 부분):$PATH"

해당 부분을 복사해서 붙여넣으면 됩니다.

 

sudo apt install python3-wxgtk4.0

그리고 패키지 시스템에서 제공하는 wxgtk 패키지를 설치하면 됩니다.

 

--------다만---------

python3.12 이상부터는 playonlinux에서 사용하는 패키지중 asyncore가 deprecated 되었습니다. 본래는 파이썬 기본패키지였으나 이제는 사라졌기에 3.12가 아닌 구버전을 쓰거나 3.12에 맞춰서 다시 설치해줘야 합니다.

 

하지만 방법은 있습니다.

https://github.com/simonrob/pyasyncore

 

GitHub - simonrob/pyasyncore: Make asyncore available for Python 3.12 onwards

Make asyncore available for Python 3.12 onwards. Contribute to simonrob/pyasyncore development by creating an account on GitHub.

github.com

여기서 제공하는 모듈을 playonlinux 폴더에 설치하면 됩니다.

 

pip로 설치하는건 위험하니까 (시스템 파이썬입니다. 다시 말씀드리자만...)

playonlinux의 스크립트가 존재하는 곳에 이 모듈을 직접 설치합니다.

 

git clone https://github.com/simonrob/pyasyncore.git

sudo cp -rf pyasyncore/asyncore/ /usr/share/playonlinux/python/

rm -rf pyasyncore

 

이렇게 하고 playonlinux 를 실행하면...

 

호환성을 맞춰가면서 실행 성공!

Playonlinux의 일부 어딘가 덜그럭거리기는 하지만 어찌됐든 실행에 성공 했습니다!!!

,

python에서 ffmpeg를 사용하는 제일 좋은 방법은 사실 os.system으로 그냥 ffmpeg를 커맨드로 날리는 겁니다.

 

하지만 이건 불편하기도 하고 보안상 위협도 되면서 파라미터를 다 알기도 어려우니 절대로 추천하지 않습니다

그래서 여러가지 관련 패키지가 있는데

 

python-ffmpeg

ffmpeg-python

 

등이 있습니다.

신기하게도 다

import ffmpeg

 

이렇게 임포트를 합니다.

그래서 적당히 잘 알아서 써야 합니다. 제가 쓰고자 하는건 ffmpeg-python 패키지 입니다.

 

뭐.. 대충 사용법은

out, _ = (
            ffmpeg.input(file, threads=0)
            .output("-", format="f32le", acodec="pcm_f32le", ac=1, ar=sr)
            .run(cmd=["./ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True)
        )

 

대충 이런식입니다. numpy형태로 out객체를 돌려줍니다.

 

그런데 여기서 유심히 봐야하는건 .run안의 cmd=["ffmpeg","-nostdin"]입니다.

-nostdin은 표준입력을 사용하지 않겠다는 의미입니다.

바로 앞의 "ffmpeg"는 ffmpeg를 실행하는 명령어를 의미합니다.

 

즉, 이 패키지는 ffmpeg를 실행해서 영상이나 음성을 numpy 형태로 바꿔주는 역할을 합니다. 그래서 ffmpeg가 설치되어야 합니다.

 

그래서 리눅스에서는 ffmpeg를 저장소에서 설치하라고 되어있습니다만...

 

어찌된 영문인지 제 PC에서는 설치되어있는 ffmpeg를 실행을 못하고 오류를 뿜더군요.

그래서 머리를 쓴게 cmd=["ffmpeg"]를 cmd["./ffmpeg"]로 고치고 ffmpeg 바이너리를 실행하는 모듈과 같은 폴더에 넣는 것이었습니다.

아 물론 chmod +x로 실행 옵션은 주고요.

 

리눅스에서 바로 실행 가능한 바이너리는

https://johnvansickle.com/ffmpeg/

 

John Van Sickle - FFmpeg Static Builds

Welcome! Here you'll find the latest versions of FFmpeg for Linux kernels 3.2.0 and up. For installation instructions please read the FAQ. Note: it's highly recommended to use git master builds, because bug fixes and other improvements are added daily. All

johnvansickle.com

여기서 다운로드가 가능합니다. 여기서 다른 필터는 다 버리고 ffmpeg와 ffprobe만 복사해서 해당 실행을 하는 파이썬 스크립트와 같은 곳에 넣어두면  ffmpeg를 실행하는데 문제를 해결 할 수 있습니다.

 

윈도우라면 역시 https://www.gyan.dev/ffmpeg/builds/ 여기서 바이너리를 다운로드받아 복사하고 cmd=["ffmpeg.exe"]로 하면됩니다.

 

 

Builds - CODEX FFMPEG @ gyan.dev

FFmpeg is a widely-used cross-platform multimedia framework which can process almost all common and many uncommon media formats. It has over 1000 internal components to capture, decode, encode, modify, combine, stream media, and it can make use of dozens o

www.gyan.dev

 

,

fairseq는 페이스북에서 만든 모듈입니다.

딥러닝쪽에서 여기저기 사용하는 편인데 이게 업데이트가 안 된건지  pyinstaller랑 안 맞는건지 패키징 하면 문제가 생깁니다.

 

https://github.com/facebookresearch/fairseq/issues/5509

 

It seems there's a minor error in 'fairseq/fairseq/dataclass /configs.py Line1103 · Issue #5509 · facebookresearch/fairseq

🐛 Bug To Reproduce Steps to reproduce the behavior (always include the command you ran): run pyinstaller exe on win10 File "fairseq\dataclass\configs.py", line 1103, in EMAConfig default=False, met...

github.com

https://github.com/facebookresearch/fairseq/issues/4659

 

NameError: name "help" is not defined · Issue #4659 · facebookresearch/fairseq

🐛 Bug I get this error when opening a cx_Freezed script that used fairseq, also I have used --package=torch to get over the problem of circular imports already, this error is new. Environment fairs...

github.com

 

일명 NameError가 나는 문제가 있습니다.

이게 그냥 쓸때는 문제가 없지만 pyinstaller로 패키징을 하면 metadata안에 있는 help문구를 찾아서 그렇다고 합니다. 사실 그냥 무시하고 돌려도 문제가 없기에 간단한 Heck이 존재합니다.

 

 

그냥 Pyinstaller로 만드는 메인 스크립트중 fairseq을 로딩하는 모듈을 임포트할때 NameError를 except처리해 버리는 겁니다.

물론 pass로 무시하는 겁니다.

 

이해가 안 되신다면

 

import fairseq

 

위 코드에서 에러가 났다면 그냥

try:

    import fairseq

except NameError:

    pass

 

이렇게 해서 그냥 예외처리하라는 겁니다. 이렇게 Heck이 늘어나는걸 별로 안 좋아합니다만 어쩔수 없지요.

 

제기랄.. 그냥 fairseq의 버그입니다.

 

 

1103번 줄을 보시면 뭔가 이상하죠?

 

default=False, metadata={help: "store exponential moving average shadow model"}

이렇게 된걸

default=False, metadata={"help": "store exponential moving average shadow model"}

 

이렇게 고치니 문제가 사라집니다. 이게 뭐야...

,