티스토리 뷰

Language/Python3

Python3 - Music playList

ShinyOcean 2021. 5. 12. 13:17

안녕하세요 :)

 

파이썬 개발 관련 세번째 포스팅은 리눅스 터미널기반 음악 재생 어플리케이션 만들기 입니다.

 

 

파이썬 개발을 시작하기 전부터 구상한 토이프로젝트였는데용

 

만약 ssh클라이언트 프로그램을 통해 서버에 터미널로 접속했을때 나만의 프로그램으로 터미널 환경에서 음악이 재생되게 하면 좋겠다 생각했습니다.

 

왜냐하면 그냥 있어 보이자나용 ㅎ 까만창에서 명령어 하나 넣고 음악나오는것이 ㅎ.....

어쨋든 이걸 어떻게 만들어볼까 하다가 파이썬 언어가 눈에 들어왔고 파이썬 개발 카테고리를 구상하게 된것입니다.

 

사실 이 간단한 어플리케이션을 하나 만드는데에도 기본적인 문법이 다들어갑니다. 입력문,출력문,조건문,반복문 심지어 쓰레드까지 사용했습니다.... 

 

그럼 거두절미하고 프로그램을 먼저 구상해볼까요?

 

 

1. 먼저 실행시 "please wait..."이라는 스트링이 약간의 딜레이를 갖으며 한글자씩 출력되었으면 좋겠습니다.

    그냥 눈속임일 지라도 뭔가 프로그램이 로딩되는 느낌을 받을수 있을것입니다.

 

2. 실행후에는 플레이 리스트들이 출력되고 키보드 인풋을 통해 음악리스트를 선택할수 있으면 좋겠습니다.

 

3. 음악리스트 선택 후에는 음악파일이 재생되면서 그 파일에대한 간단한 정보가 출력됬으면 좋겠습니다.

 

 

 

위와 같은 조건을 가지고 한번 시작해보겠습니다.

 

 

먼저 첫번쨰로 실행시 스트링이 약간의 딜레이를 갖으며 출력되는것입니다.

 

s 라는 변수 안에 스트링 형태로 값을 초기화해주고 반복문을 돌렸습니다.

 

파이썬에서 for 문의 형식은 다음과 같습니다.

 

for 루프안에서 증가될변수 in 반복할횟수 :

      <들여쓰기를 통한 루프 in>

 

저는 스트링 s 변수의 길이 만큼 i를 증가시키며 반복하겠다는 for loop을 선언했습니다.

 

그후 print() 함수를 통해 출력해주는데요, end를 ' ' 공백으로 초기화 해주는것은 eof 에러를 방지하고 하나의 스트링으로 인식시켜주기 위해서 였습니다. 그다음 flush = true 는 함수의 효율을 높여주기위해 호출시 버퍼를 사용하지 않는다는 옵션입니다.

 

다음으로 time.sleep() 을 통해 딜레이를 주었습니다.

 

위 코드의 효과는 다음과 같습니다.

 

 

 

다음은 리스트가 출력되고 키보드 인풋을 통한 선택인데요 여기부터 본게임입니다.

 

리스트 출력은 그냥 print문을 아래와 같이 이쁘게 잘 만들었습니다.

먼저 환영한다는 메세지를 출력후 1초의 딜레이후 음악 리스트를 출력할수 있도록 하였습니다.

 

그리고 나서 input 을 받았습니다.

 

먼저 input으로 들어온 데이터를 int형으로 강제 타입변환 해주어야 합니다.

그래야 나중에 조건문을 돌릴때 에러가 없습니다

 

그다음 아주 중요한 팁을 알려들겠습니다...!

 

 

저는 우분투 리눅스의 터미널 환경에서 파이썬 개발을 하고 있는데요 이게 참 아이러니하게 인풋함수를 사용하면 EOF 에러가 뜨는거에요..... 한참 찾아보고 구글링하고~ 했는데 일단 문제 없이 input 함수를 호출했는데 EOF 에러가 뜬다면 코드는 잘못되지 않았습니다!!! 단지 터미널의 텍스트 에디터나 운영체제에 따른 컴파일 과정에서 문제가 생긴거로 판단이 되는데요

 

이때 해법이 execute 파일을 만들어주는것입니다.

 

pip 을 통해 pyinstaller 라는 라이브러리를 설치하신후 아래의 명령을 통해 빌드해주세요

 

pyinstaller --onefile 파일명.py 

 

그럼 해당 디렉터리내에 /dist라는 디렉터리가 생성되었을 것입니다. 그안에 있는 실행파일을 실행해준다면 input 라인에서 EOF 에러 없이 컴파일 결과를 얻어낼수 있습니다. 다만, 실행파일을 빌드하는시간이 python3 < 스크립트파일 명령으로 컴파일 하는 시간보다 다소 오래 걸립니다. 그래도 정상적으로 우분투 리눅스환경 터미널로도 input()을 쓸수 있습니다.

 

처음에는 저도 위의 방식으로 실행파일을 만들어 실행하니 인풋함수가 잘 먹어서 기분이 좋았는데 요즘은 그냥 스크립트파일을 명령으로 주어도 잘 컴파일 됩니다.... 이상해요....

 

어쨋든 다음은 음악 재생에 관련된 코딩을 시작해 주어야 합니다.

 

파이썬코드에서 음악 파일을 재생하는 방법은 다음과 같습니다.

 

1. playsound 라이브러리를 pip3 를 통해 설치한다.

2. 라이브러내의 함수 인 playsound(파일경로) 를 통해 지정된 경로의 음악 파일을 실행한다

 

간단하죠? ㅎㅎ

 

그럼 저는 재생할 네개의 파일을 지정된 경로에 먼저 저장하고 경로를 별도의 변수로 초기화 하였습니다.

파일의 경로만 보았을 때 코딩시 이게 무슨 음악파일이었지 하고 헷갈려서용 아래와 같습니다.

 

그리고 이를 재생할때는 위에서 키보드 인풋을 통해 num 변수에 초기화해서 조건문을 돌려줄것이라 했었죠

아래의 조건문이 그것입니다.

 

 

 

그런데 각각의 조건문 안에 t1, t2등으로 스레드가 있는것을 확인할수 있을것입니다.

 

스레드를 포함시키지 않아도 이미 우린 인풋을 통해 입력받은 변수로 플레이리스트를 고를수 있고 골라진 리스트에 따라 음악을 재생할수 있는 어플리케이션을 완성했습니다.

 

스레드는 각각의 음악에 대한 텍스트 정보가 처음에 please wait.. 문구를 출력했을떄 처럼 딜레이를 가지고 화면에 출력되는 효과를 넣은것입니다.

 

처음엔 스레드가 없이 실행했을때는 동기식 프로그래밍 방식으로 인해 음악이 재생되고있지만 정보는 출력되지 않았습니다.

당연히 맨윗라인부터 한줄씩 스크립트가 실행되는 방식이니 음악파일의 실행이 완료되어야만

정보를 출력하는 코드가 실행될테니까요

 

하지만 음악은 음악대로 실행되고 동시에 정보를 출력하는 함수까지 실행하기 위해 스레드를 이용하였습니다.

 

 

스레드의 내용은 위와 같습니다. 가장 쉽게 스레드를 구현하는 코드예를 구글링하여 따라 하였습니다. 함수의 매개변수를 튜플형태로 주는 방식인데 자바처럼 따로 스레드 관련 라이브러리를 import해 주어야합니다.

 

하지만 자바보다는 간단한 방식입니다. 자바의 경우 스래드 클래스를 상속받아 그안의 run메소드를 오버라이딩해주고

메인함수에서 스래드 객체를 생성하여 사용하는 복잡한 방식이지만 파이썬의 경우 그보단 간단하였습니다.

 

어쨋든 이번 어플리케이션에서 가장 핵심이 되는 내용은 playsound 라이브러리를 import하여 그안의 함수를 사용해서 음악파일을 파이썬에서 재생하는 것입니다.

 

여러분도 리눅스 터미널환경과 파이썬, 몇개의 라이브러리 그리고 음악송출 하드웨어만 갖추어져 있다면 본인만의 음악파일을 재생할수 있는 터미널 어플리케이션을 빌드해서 이용해 보세용 ㅎㅎ

 

저는 무식하게 스레드를 복붙하는 방식으로 개발했지만 조금만더 생각하면 한 스래드 객체 선언만으로 해결할수 있을것입니다.

 

그냥 이런 방법도 있다~로 참고 해주세요

 

 

'Language > Python3' 카테고리의 다른 글

Python3 - todolist(text) demo  (0) 2021.05.14
Python3 - Todolist (test mode), use Database  (0) 2021.05.14
Python3 - Git & Github(2)  (2) 2021.05.08
Python3 - Git & Github(1)  (1) 2021.05.07
Python3 - intro  (0) 2021.05.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함