728x90
반응형

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateWebServer.html

(인스턴스 생성은 위 사이트 참고)

 

1) 첫번째 고난 - PYTHON 설치

Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type로 인스턴스를 생성하게 되면

 

처음에 python2.*이 기본으로 깔려있다.

하지만 python version2는 더이상 지원되지 않음 & python3를 많이 사용하고 구문이 다름 & 애들은 장고를 python3로 했다

라는 이유들로 python3를 설치해보도록 한다. 

 

차라리 파이썬이 안깔려있다면 더 편했겠지만(python3을 설치해도 2버전이 먼저 연결되어 있기에 버전확인을 하면 2라고 출력된다. 때문에 설치 후 사용환경 설정도 필요하다)

 

파이썬이 안깔려있고 내게 명령어가 더 친숙한 우분투로 인스턴스를 새로 생성하였으나 실수로 또 python2를 설치해버려서 (화나서) 그냥 끄고 Linux로 돌아왔다.

(우분투에서 sudo apt-get install python-pip를 했는데 python2가 깔렸다. 아직은 파이썬 기본 명령어가 2에 맞춰져 있는듯 하다)

 

https://nrhan.tistory.com/entry/AWS-EC2-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%97%90-python-36-%EB%B2%84%EC%A0%84-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

 

AWS EC2 리눅스 인스턴스에 python 3.6 버전 설치하기

AWS EC2를 활용한 웹 서버 구축기 ssh를 통해 AWS EC2 인스턴스 접속에 성공했었습니다. 그 방법은 https://aws.amazon.com/ko/getting-started/tutorials/launch-a-virtual-machine/를 참조하습니다. 기쁜 마음..

nrhan.tistory.com

 

그래도 감사하게도 위 페이지에서 이미 python2가 설치되어있는 인스턴스에 python3를 얹는 작업을 안내해준다.

방법을 설명하기엔 위에서 너무 상세하게 얘기해서 더 할말이 없고 새로 알아낸 사실은

현재 파이썬이 3.8.5까지 나왔는데 ec2 linux에서 제공하는 패키지는 3.6까지만 있다. 아직 업데이트가 안된듯하다.

 

이제 장고를 깔려했는데 pip는 또 파이썬2에 맞춰져 있다고 한다. 정말 쉽지 않다.

 

2) 두번째 고난 - Django 설치

파이썬 버전은 3인데 pip는 파이썬2꺼라고 한다. 

이번엔 해법을 찾는데 오래걸리지 않았다. 

window에서는 장고를 설치할 때 pip install django 라는 명령어를 이용했는데 이번에는 python3의 pip를 사용해야 하기 때문에 앞에 python3를 붙여주었다.

sudo python3 -m pip install django~=2.0.1
위 명령어를 사용하니 잘 설치가 되었다. 장고 버전은 구글에 장고를 검색하였을 때 안정화 버전이라고 나와있어서 썼다.

 

장고 설치를 완료해도 계속 pip를 upgrade라하는 warning 문이 나온다.

sudo python3 -m pip install --upgrade pip

앞에 python3를 명시해 pip도 upgrade 해주었다.

 

이 과정이 완료되면 pip는 업그레이드 되고 pip명령어는 더이상 작동하지 않으며 사용하려면 pip3라고 입력해야한다.

3) 이젠 고난 아닌줄 알았던 가상환경 설치 및 장고 test

드디어 python과 pip를 정상적으로 사용할 수 있기 때문에 드디어 제대로 시작해본다.

 

우선 django 프로젝트 생성 전에 장고를 위한 가상환경을 구축한다.

기존 window에서 쓰던 것과 유사하게

pip3 install virtualenv 명령어를 사용해 가상환경을 설치한다.

설치 완료 후에

virtualenv myenv 명령어로 myenv라는 가상환경을 생성했고 이제 putty에 접속해 myenv\Scripts\activate를 하려했는데 myenv 안에 Script가 없다.

잠시 뇌정지가 왔지만 구글에 찾았더니 해법이 있다. 

source myenv/bin/activate

됐다. 

 

이제 윈도우에서 하는것과 마찬가지로 프로젝트를 제작하면된다.

django-admin startproject Testproject //프로젝트 생성

cd Testproject //프로젝트 디렉토리로 들어가기

python manage.py runserver

이렇게 하면 내 인스턴스 ip를 이용해 서버를 돌릴 수 있다고 생각했는데 127.0.0.1로 들어가란다.

의아해서 구글링을 해보니

python manage.py runserver 0:8000

이런 식으로 입력해야 ip주소 또는 호스트 주소를 사용할 수 있다고 한다.

 

이제 진짜 사이트가 들어가져야하는데 안들어가진다. 생각해보니 인스턴스 보안그룹에 tcp 포트를 옛날에 설정한게 기억이 났다.

내 인스턴스 - 보안그룹 - 인바운드 규칙 편집 - 규칙 추가하기 해서 원하는 포트로 tcp를 열어주면 된다.

8000말고 다른 숫자도 가능하다.

그렇게 하면 이런식으로 8000포트에 모든 위치에 있는 사용자가 접속할 수 있다. 

 

이제 진짜로

python manage.py runserver 0:8000

를 실행하면 주소창에 **.**.**.**:8000(*은 내 IP)를 입력해 성공적으로 설치되었다는 화면을 3시간만에 만날 수 있었다.

 

 

이제 진짜 끝.

 

후기 : AWS ec2만 세번째 프로젝트인데 아직 서툴다.

 

728x90
반응형
728x90
반응형

[200727 시도] - 회사컴

1 )사이트에서 파이썬을 다운받고 설치 https://www.python.org/downloads/ 
    *주의할 것* 설치프로그램 실행하고 설치 시작하기 전에 Add python3.8.5 to Path 체크하고 시작해야함

 

              안하면 설치하고 환경변수 처리해야하는 아주 번거로운 일이 생김

 

2) 위 주의를 수행했다면 설치 후 바로 명령 프롬포트에서

python --version

을 입력하면 버전이 잘 나올 것임. 혹시 모르니

pip --version

도 확인하기. 일반적으로는 다 됨

 

3) 이제 파이썬 설치가 끝났으니 가상환경을 설치한다.

pip install virtualenv

 

4) 가상환경을 생성한다.

virtualenv myenv

 

5) myenv\Scripts\activate 명령어를 입력해 가상환경으로 들어가서 장고를 설치한다.

pip install django

 

6) 원하는 디렉토리로 이동해 프로젝트를 생성한다. (testlogin은 내가 임의로 정해둔 것이니 자기가 하고싶은 이름 넣어도 됨)

django-admin startproject testlogin

 

7) cd testlogin으로 디렉토리에 들어간 후 앱을 생성해준다.(testlogin_app도 내맘대로 지은거임)

python manage.py startapp testlogin_app

 

[200728] 로그인 회원가입 뿌시기 성공

https://infinitt.tistory.com/64?category=1072777

위 사이트에서 장고 설치부터 회원 가입 및 로그인, 템플릿 적용까지 정말 상세하게 알려준다.

(내가 설명하는것보다 삼만배 자세해서 참고하길 바랍니다) 

 

<결과화면>

728x90
반응형
728x90
반응형

파이썬에서 엑셀 자료를 읽을 수 있는 라이브러리는 2개로 pandas와 openpyxl이 있다.

내가 가지고 있는 엑셀 파일은 xls로 Excel1997인가? 쨌든 되게 오래된 버전의 엑셀임.

openpyxl이 엑셀파일을 다루기엔 더 편해보이는데 아쉽게도 xls는 지원하지 않는다.

나도 설치했다가 지원안해준다길래 그냥 판다스로 했다.

 

일단 내가 엑셀 파일에서 필요한 건 B와 C 행이다. 이들은 딕셔너리 형태로 만들거다. 

프로그램을 시작할때마자 이짓을 하는건 너무 비효율적이기 때문에 

str 변수에 딕셔너리 모양으로 넣고, text파일엔 넣은 다음, text를 py파일로 복붙해서 만들거다.

귀찮아서 대충 했다. 어차피 모양만 잡고 버릴 코드기에.

 

import pandas as pd

#엑셀 읽기
a1 = pd.read_excel('a1.xls', header=1)
#읽은 엑셀을 리스트로변환
alist = a1.values.tolist()

#리스트에서 한 행씩 읽어서 str변수에 원하는 형태로 삽입
tupletext = "sign = {"
for i in range(len(alist)):
    tupletext += "\""+str(alist[i][2])+"\" : " + str(alist[i][1]) + ","
    if i%7 == 0 :tupletext += "\n"

tupletext += "}"

#text 파일 만들기
f= open("sign1.txt","w",-1,encoding="utf-8")
#만든 str을 text에 넣기
f.write(tupletext)
#파일 닫기
f.close()
print(tupletext)

tupletext는 위처럼 예쁘게 나온다. 딕셔너리 만드는건데 튜플로 착각해서 변수명을 잘못지었다ㅎ

 

if i%7 == 0 : tupletext += "\n" 이 함수는 좀 길어지면 다음줄로 넘기기 위하여 썼다.

원래는 없었는데 내가 읽는 엑셀파일의 행이 12000줄이라서 한줄로 str을 만들면 어마어마하게 길다.

메모장 켜서 볼땐 문제가 없었는데 py파일로 복붙하니까 파이참이 렉걸려서 엔터쳐서 다시 넣었다.

 

print(sign["이론"])

 

테스트겸 key값으로 value 잘 나오나 해봤는데

잘 나온당

    #단어주소 들가서 영상주소 크롤링해서 리턴
    def crawling(self):
        word = "지금"
        if word in sign.find_num.keys():
            num = sign.find_num[word]
            html = urlopen("http://sldict.korean.go.kr/front/sign/signContentsView.do?origin_no={}".format(num))

            soup = BeautifulSoup(html, "html.parser")
            video_url = str(soup.find(id="preview").get("value"))
            video_url = video_url[:92] + "700X466.mp4"
            return video_url
        else :
            print("일치하는 단어 없음")
            return None

 

 

만들어 두었던 메인 코드에서도 잘 합쳐지나 했는데 수화 영상도 잘 나오고 지연도 거의 없다!

728x90
반응형
728x90
반응형

* pycharm에서 pyqt5 하고 opencv-python 패키지 설치해야합니다 *

 

PyQt5는 Gui를 만드는 라이브러리, Open CV는 동영상을 재생하는 라이브러리다.

간단히 PyQt5로 GUI 창을 만듦

-> 버튼, 이미지 등 처럼 비디오를 재생할 수 있는 비디오 위젯이 제공됨

-> 비디오 위젯하고 Open CV를 매칭

-> Open CV로는 저장된 영상 가져오기

이러한 일련의 과정을 통해서 구현이 가능하다.

 

이번 게시물에서는 주석으로 설명할 것이다.

#PyQt5 라이브러리
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPixmap, QImage
#open cv에서는 영상을 프레임단위로 가져오기 때문에 sleep을 통해서 프레임을 연결시켜주어 영상으로 보이게 만드는 것임
from time import sleep
#비디오 재생을 위해 스레드 생성
import threading
#화면을 윈도우에 띄우기 위해 sys접근
import sys

#open cv 라이브러리
import cv2

#메인문
if __name__ == "__main__":
    import sys

    #화면 만들려면 기본으로 있어야 하는 코드들 건들지않기
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)

    #영상 스레드 시작
    ui.video_thread(MainWindow)

    #창 띄우기
    MainWindow.show()

    sys.exit(app.exec_())

 가장 기본이 되는 메인 문이다. 여기를 시작으로 여러 모듈들이 수행될 것이기 때문에 앞으로 수정될 여지가 있다.

 

class Ui_MainWindow(object):
    #기본적으로 창만드는 작업
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("ForSign")
        MainWindow.resize(500, 300) #창 사이즈
        MainWindow.move(500,500) #창 뜰 때 위치
        #이 아래로는 나도 잘 모름 화면을 구성하고 영상을 재생하는 위젯을 만드는거 같음 유지해두는게 나을듯
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.video_viewer_label = QtWidgets.QLabel(self.centralwidget)
        self.video_viewer_label.setGeometry(QtCore.QRect(10, 10, 400, 300))

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    #단어주소 들가서 영상주소 크롤링해서 리턴
    def crawling(self):
        num = "6848"
        options = webdriver.ChromeOptions()
        options.add_argument('headless')
        driver = webdriver.Chrome('/Users/sowon/Downloads/chromedriver', options=options)
        #5초 지연의 주범. 동적페이지라서 selenium을 꼭 써야지 비디오 주소가 접근되는데 이거때문에 지연이 생김
        driver.get('http://sldict.korean.go.kr/front/sign/signContentsView.do?origin_no={}'.format(num))

        html = driver.page_source
        soup = BeautifulSoup(html, 'lxml')
        # print(soup.find('video'))
        video_url = soup.find(type="video/mp4").get("src")
        return video_url

    def Video_to_frame(self, MainWindow):

        video_url = self.crawling() #crawling 함수로 영상주소 받아서 변수에 저장
        savename = 'save_by_urllib.mp4' #저장될 영상 이름

        urllib.request.urlretrieve(video_url, savename) #영상 주소 접근해서 저장
        print("저장완료")

        cap = cv2.VideoCapture('save_by_urllib.mp4') #저장된 영상 가져오기 프레임별로 계속 가져오는 듯

        ###cap으로 영상의 프레임을 가지고와서 전처리 후 화면에 띄움###
        while True:
            self.ret, self.frame = cap.read() #영상의 정보 저장
            if self.ret:
                self.rgbImage = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB) #프레임에 색입히기
                self.convertToQtFormat = QImage(self.rgbImage.data, self.rgbImage.shape[1], self.rgbImage.shape[0],
                                                QImage.Format_RGB888)

                self.pixmap = QPixmap(self.convertToQtFormat)
                self.p = self.pixmap.scaled(400, 300, QtCore.Qt.IgnoreAspectRatio) #프레임 크기 조정

                self.video_viewer_label.setPixmap(self.p)
                self.video_viewer_label.update() #프레임 띄우기

                sleep(0.01)  # 영상 1프레임당 0.01초로 이걸로 영상 재생속도 조절하면됨 0.02로하면 0.5배속인거임

            else:
                break

        cap.release()
        cv2.destroyAllWindows()

    # 창 이름 설정
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("ForSign", "ForSign"))

    # video_to_frame을 쓰레드로 사용
    #이게 영상 재생 쓰레드 돌리는거 얘를 조작하거나 함수를 생성해서 연속재생 관리해야할듯
    def video_thread(self, MainWindow):
        thread = threading.Thread(target=self.Video_to_frame, args=(self,))
        thread.daemon = True  # 프로그램 종료시 프로세스도 함께 종료 (백그라운드 재생 X)
        thread.start()

class로 창 제작과 기능 수행이 편리하게 해두었다. 사실 오픈소스인데 UI 구성부터 스레드, openCV와 비디오 위젯 매칭까지 되어있어서 많은 도움이 되었다. 내가 만든 함수는 crawling 과 Video_to_frame의 일부로 crawling은 이전전 개시물과 같다.

Video_to_frame 함수는 이전 게시물에서 소개했던 동영상 주소를 활용해서 동영상을 저장하는 것으로 시작한다.

 

위 코드들은 합치고 빠진 라이브러리를 임포트하면 실제로 돌아가는 코드로

크롤링 -> 영상 저장 -> 영상 재생 까지 다 된다. 함정은 selenium때문에 창이 띄워지고 5초 뒤에 영상이 나옴.

그래도 숫자 바꿀때마다 새로운 영상으로 실행 잘 되서 뿌듯

PyQt5 , Open CV라이브러리를 활용해서 GUI로 동영상 재생하기

728x90
반응형
728x90
반응형
import urllib.request

def save_video(video_url) :
    savename = 'save_by_urllib.mp4'

    urllib.request.urlretrieve(video_url,savename)
    print("저장완료")

savename은 영상을 저장하면 보관될 파일 명

인자로 ex) http://www.aaa.com/a.mp4 이런 식의 파일로 접근할 수 있는 주소와 저장할 이름만 넣으면 된다.

 

다음 게시물은 PyQt5 라이브러리를 사용해서 파이썬 Gui로 영상 재생하기

728x90
반응형
728x90
반응형

* 패키지는 beautifulsoup4 하고 selenium을 다운받으면됨 *

 

필요한 단어의 고유 번호를 가지고 한국수어사전 사이트를 크롤링해서 단어의 영상 주소를 가져오려 했다.

스크래핑은 편하고 많이 쓰이는 BeautifulSoup를 썼다

 

하지만 왼쪽의 페이지 소스처럼 videoarea id안에 밑줄친 주소를 가지고 와야하는데 아무리해도 None값이 나오더라.

그래서 전체 페이지 소스를 긁어와봤는데 videoArea 하부가 텅 비어있었다.

사이트는 동적인 작업으로 영상 주소를 삽입하나 보다,,,,

동적 사이트 크롤링은 한적 없어서 다소 귀찮았지만 우리에게 주어진 자료는 고유번호밖에 없기에 selenium을 사용해서 크롤링을 시도했다.

 

selenium은 동적 페이지 크롤링할 때 정말 많이 쓰이는 라이브러리로 드라이버가 필요하다. 여기서 드라이버는 직접 페이지를 돌려주는 도구다. 즉, 사이트에 직접 들어가야 페이지주소를 가져올수 있기 때문에 시간이 훨.씬. 오래걸린다.

 

일단 드라이버는 chrome web driver, phantom JS, headless 등이 있다고 한다.

내가 참고한 사이트는 크롬 드라이버를 처음으로 안내해줘서 그냥 했다. (근데 크롬 드라이버는 이제 지원이 끝났다고 한다. 지금 사용하는 데에 문제는 없다.)

일단 https://sites.google.com/a/chromium.org/chromedriver/downloads이 사이트를 들어가서 내 크롬 버전에 맞는 드라이버를 다운받아야한다. 다운 받아서 압축만 풀어두면 사전작업 끝. 대신 디렉터리를 알아둬야하는데 난 그냥 다운로드 디렉토리에 두어서 '/Users/sowon/Downloads/chromedriver' 이런식이다.

 

from selenium import webdriver
from bs4 import BeautifulSoup


def crawl_video_url(num) :
	#크롤링
    options = webdriver.ChromeOptions()
    options.add_argument('headless')
    driver = webdriver.Chrome('/Users/sowon/Downloads/chromedriver', options=options)
    driver.get('http://sldict.korean.go.kr/front/sign/signContentsView.do?origin_no={}'.format(num))
	
    #selenium으로 크롤링한 페이지 소스 중에 필요한 부분 찾는거는 beautifulSoup 그냥 씀 이게 편해서
    html = driver.page_source
    soup = BeautifulSoup(html,'html.parser')
    video_url = soup.find(type="video/mp4").get("src")
    print(video_url)
    save_video(video_url)

 

코드는 간단하다. driver 변수를 선언하는 코드에 아까 다운받은 드라이버 디렉터리만 붙여놓으면 된다. 사실 함수 시작하고 3줄만 있어도 크롤링이 되는데 options.add_argument('headless') 이거를 선언안하니까 코드를 수행하면 크롬 창이 자동으로 떠서 주소로 돌아간다. 마치 팀뷰어로 내 컴퓨터를 조종하는 느낌.

어쨌든 저 코드를 쓰고 driver작업에서 options을 지정해주면 실행해도 창이 안뜨고 작업이 수행된다.

 

 

-------------------------------------------------------------------------------------------------------

html 변수 부터 코드는 주소 찾아내는 코드라서 중요하진 않다.

 

문제는 그냥 bs4만 써도 1초는 걸렸는데, selenium을 쓰면 실행하고 5초는 지나야 값이 리턴된다. 빠른 동작을 필수로 하는 우리 프로젝트에는 너무 치명적이다. 드라이버 문제일까봐 팬텀js도 써봤는데 warning 안내만 추가되고 시간은 비슷하게 걸리더라. headless가 요즘 대세라고 해서 써보려했는데 내 크롬 버전에 맞는게 없다. 날라갈까봐 살짝 두려워서 보류해두었는데 시도해볼 예정임

 

마지막 코드인 save video 함수는 영상 주소를 활용해서 영상을 다운받는 함수로 다음 게시물에서 안내한다.

728x90
반응형

+ 최근 게시글