728x90
반응형

label 필드

레이블 필드를 추가해두면 지라 검색 시 관련된 이슈를 편하게 찾을 수 있다.

티켓의 수가 많을 경우, 레이블을 하나씩 손으로 작성해주기는 귀찮기 때문에 파이썬의 JIRA Package를 활용해서 추가해줬다.

 

from jira import JIRA

class JiraAPI:
    def __init__(self, url:str, auth:set):
        self.options = {'server': url}
        self.jira = JIRA(self.options, basic_auth=auth)
        
    def set_labels(self, issue_ids:str, labels:list):
    	for issue_id in issue_ids:
	    	issue = self.jira.issue(issue_id)
            
    		for label in labels:
        	    issue.update(labels= [ {'add': str(label)} ] )
        
    def delete_labels(self, issue_ids:str, labels:list):
    	for issue_id in issue_ids:
	    	issue = self.jira.issue(issue_id)
            
    		for label in labels:
        	    issue.update(labels= [ {'remove': str(label)} ] )


if __name__ == "__main__":
    jira = JiraAPI(url="https://company.atlassian.net", auth=("email", "token"))
    
    dev_labels = ["개발팀", "DEV"]
    stg_labels = ["개발팀", "STG"]
    prd_labels = ["DevOps팀", "PRD"]
    dev_issueids = ["DEV-1234"]
    prd_issueids = ["DEVOPS-1234", "DEVOPS-1235"]

    jira.set_labels(dev_issueids, dev_lables)
    jira.set_labels(prd_issueids, prd_labels)

 

728x90
반응형
728x90
반응형

python으로 QR-CODE 생성하려면 아래 qrcode[pil] 패키지를 import 한다.

pip install qrcode[pil]

 

아래 코드를 사용하면 png 형식으로 qrcode를 만들 수 있다.

import qrcode
    
img_url = qrcode.make("https://hwan001.co.kr/")
img_url.save("qrcode.png")

 

728x90
반응형
728x90
반응형

requirements.txt

 파이썬으로 만든 코드에서 필요한 패키지를 쉽게 표현하기 위해 사용된다. 

내부는 아래처럼 필요한 패키지들의 이름을 적어준다.

pandas==1.3.5
numpy
tensorflow
tqdm
pandas_datareader
finance-datareader
beautifulsoup4
yfinance
pymongo
yahoo_fin
requests_html
flask
flask-cors
flask_restx
pytest

== 을 사용하여 필요한 버전을 명시해줄 수도 있다.

 


패키지 설치

 Python에서 패키지를 설치할 땐 pip 명령어를 사용한다.

위의 파일을 사용하여 패키지를 설치하려면 아래 명령어를 사용하면 된다.

pip install -r requirements.txt

 

하지만 매번 같은 명령어를 실행하기는 귀찮기 때문에 아래와 같은 pip_requirements.py 파일을 하나 더 많들어서 사용하고 있다.

import sys
import subprocess

if __name__ == '__main__':
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])

 

만약 pip가 없다면 아래 링크의 내용이나 밑의 코드를 실행하여 get-pip.py로 저장해주자.

# pip install
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

# pip upgrade
python -m pip install --upgrade pip

 

728x90
반응형
728x90
반응형

FastAPI

FastAPI는 Python 3.6이상의 API를 빌드하기 위한 빠르고 현대적인 웹 프레임워크이다.
웹 부분을 위한 Starlette와 데이터 부분을 위한 Pydantic 덕분에 NodeJS와 Go에 대등할 정도로 높은 성능을 가지고 있으며, 빠른 코드 작성이 가능하다. 직관적이고 쉬운 코드로 인해 휴먼 에러가 약 40%(내부 개발팀 테스트 기준) 감소했다고 한다. 또한 API에 완전히 호환되는 개방형 표준을 기반으로 하여 Swagger(OpenAPI)와 json Schema를 지원한다.

개인적으로는 Flask와 문법이 비슷하지만 기본적으로 추가된 기능이 많고 Django보다는 자동화(?)는 덜 되었지만 훨씬 가볍고 빠르다는 느낌을 받았다.

자세한 내용은 아래 공식문서를 참고
https://fastapi.tiangolo.com/ko/

 

FastAPI

FastAPI FastAPI 프레임워크, 고성능, 간편한 학습, 빠른 코드 작성, 준비된 프로덕션 문서: https://fastapi.tiangolo.com 소스 코드: https://github.com/tiangolo/fastapi FastAPI는 현대적이고, 빠르며(고성능), 파이썬

fastapi.tiangolo.com


설치 및 실행

pip를 통해 설치한다. 제품화를 위해서는 Uvicorn이나 Hypercorn과 같은 ASGI 서버가 필요하다.
패키지의 설치는 https://hwan001.tistory.com/308 글을 참고하면 편하다.

pip install fastapi
pip install "uvicorn[standard]"


위 공식 링크에 있는 main.py 예제를 가져와봤다.

from typing import Union
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

위 10줄의 코드로 2개의 엔드포인트가 완성된다.

코드를 실행하려면 uvicorn이 필요하다.

uvicorn main:app --reload


공식 문서에서는 위 명령어로 방법을 설명하지만, pip로 "uvicorn[standard]"을 install 하면 에러가 발생하고 명령어로 쳐봐도 당연히 실행되지 않는다. 그래서 아래처럼 python 코드 상에서 실행하는 방법을 찾았다.
실행에 문제가 없고 디버깅 측면에서도 더 좋다고 생각한다.

from typing import Union
from fastapi import FastAPI
import uvicorn # pip install uvicorn

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

if __name__ == "__main__":
    uvicorn.run(app, port=8000)


코드를 실행 후 http://127.0.0.1:8000/items/5?q=somequery로 접속하면 JSON 응답을 볼 수 있고,


http://127.0.0.1:8000/docs (또는 redoc)로가면 Swagger UI로 자동 작성된 API 문서를 볼 수 있다.

docs
redoc


 

비동기 처리

FastAPI의 장점 중 하나는 비동기 처리를 지원한다는 점이다.
아래처럼 직접 작성한 코드나 라이브러리가 비동기 기능을 사용할 경우 async def 를 사용할 수 있다.

@app.get('/')
async def read_results():
    results = await some_library()
    return results

 

참고 링크

https://wikidocs.net/book/8531

 

점프 투 FastAPI

점프 투 FastAPI는 파이보라는 이름의 파이썬 게시판(Python Board) 서비스를 만들어가는 과정을 설명한 FastAPI 입문서이다. 파이썬 설치부터 시작하여 서…

wikidocs.net

https://github.com/tiangolo/fastapi

 

GitHub - tiangolo/fastapi: FastAPI framework, high performance, easy to learn, fast to code, ready for production

FastAPI framework, high performance, easy to learn, fast to code, ready for production - GitHub - tiangolo/fastapi: FastAPI framework, high performance, easy to learn, fast to code, ready for produ...

github.com

 

728x90
반응형
728x90
반응형

 이름이나 확장자는 다르지만 사실 동일한 파일이 있다.

이 2개의 파일을 코드로 구분하려면 어떻게 해야 할까? 그리고 디렉토리 내에 그런 파일들이 여러개 있다면 어떻게 찾을 수 있을까?

 

아래 파일은 get_tickers.py를 복사하여 .txt로 확장자를 바꾼 동일한 파일이다. 2개의 파일이 사실은 같다는 걸 코드로 확인해보자.

 

 파일이 동일하다는 걸 확인하려면 파일 전체를 해쉬로 만들어 값을 비교해보면 된다.

코드로 작성해보자.

import hashlib

def my_hash(file):
    with open(file, 'rb') as f:
        read_data = f.read()
        hash = hashlib.sha512()
        hash.update(read_data)
        hexSHA512 = hash.hexdigest()
        hashValue = hexSHA512.upper()

    return hashValue

file_a = "C:\\Users\\Hwan\\Desktop\\TestDir\\get_tickers.py"
file_b = "C:\\Users\\Hwan\\Desktop\\TestDir\\get_tickers.py.txt"
hash_a = my_hash(file_a)
hash_b = my_hash(file_b)

print(file_a)
print(file_b)
print(hash_a)
print(hash_b)
print(hash_a == hash_b)

파일의 내용을 sha512로 해싱해주는 함수를 작성했다.

코드를 실행하면 이름과 확장자는 달라도 내용은 같다는 걸 알 수 있다.

 

 폴더 내부를 전체 탐색하기 위해 아래 코드를 작성했다.

import os

workspace = "C:\\Users\\Hwan\\Desktop\\TestDir"
keywords = ["pass"]
list_result = []

for file in os.walk(workspace):
    if any([True if keyword in file[0] else False for keyword in keywords]): continue
    
    for x in file[2]:
        list_result.append(file[0] + "\\" + x)
        
print(list_result)

 

코드를 실행하면 입력받은 경로 밑의 (경로나 파일 명에 pass가 포함되지 않은) 모든 파일을 리스트에 담아준다.

 

이제 입력한 경로 내의 모든 동일한 파일을 찾도록 아래의 코드를 추가했다.

dict_hash = {}     
for file in list_result:
    try:
        dict_hash[my_hash(file)].append(file)
    except:
        dict_hash[my_hash(file)]= [file]

딕셔너리의 키로 파일 내용을 해싱한 값을 줬고, 값으로는 해당 해쉬값을 갖는 파일명 리스트를 담았다.

 

아래는 전체 코드이다.

import os
import hashlib

def my_hash(file):
    with open(file, 'rb') as f:
        read_data = f.read()
        hash = hashlib.md5()
        hash.update(read_data)
        hexSHA512 = hash.hexdigest()
        hashValue = hexSHA512.upper()

    return hashValue

workspace = "C:\\Users\\hwan\\Desktop"
keywords = ["pass"]
list_result = []

for file in os.walk(workspace):
    if any([True if keyword in file[0] else False for keyword in keywords]): continue
    
    for x in file[2]:
        list_result.append(file[0] + "\\" + x)
        

dict_hash = {}     
for file in list_result:
    try:
        dict_hash[my_hash(file)].append(file)
    except:
        dict_hash[my_hash(file)]= [file]
        
for x in dict_hash:
    if len(dict_hash[x]) > 1:
        print(x, dict_hash[x])

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

QR-CODE 생성하기  (2) 2023.03.29
[Python] requirements.txt로 패키지 설치하기  (0) 2023.01.12
FastAPI  (0) 2023.01.12
[Python] Docstring  (0) 2022.11.27
[Python] OS 모듈 : 디렉토리 전체 탐색하기 (하위 디렉토리까지)  (0) 2022.11.20
[python] JWT 모듈  (0) 2022.09.13
728x90
반응형

Docstring

 파이썬은 자료형이 명시되지 않기 때문에(언어의 동적 특성) 파이썬에서의 문서화는 매우 중요하다.

문서화를 위해서 파이썬은 docstring이라는 문서화 문자열 기능을 제공하고 """ 문서화 문자열입니다. """ 처럼 표현할 수 있다. docstring은 모듈, 클래스, 함수에 붙일 수 있고 각 객체의 __doc__ 속성에 접근하여 문자열을 가져올 수 있다. 어떤 대상에 docstring을 작성할 지에 따라 적어야하는 내용들도 달라진다. 

*더 많은 내용은 https://peps.python.org/pep-0257/ 를 참고


 

모듈 docstring

 각 모듈에는 최상위 docstring이 필요하다.

docstring의 첫문장은 모듈의 목적을 기술하는 한 문장으로 구성되며 이후는 모듈의 동작을 자세히 설명한다.

 

예시)

"""
Library for testing

Test Module info

Available functions:
- func1 : test function 1
- func2 : test funtion 2
"""
...

 

클래스 docstring

 클래스 수준의 docstring은 모듈 docstring과 거의 비슷하다.

첫 번째 문장에서 클래스의 목적을 기술하고 이후는 동작을 설명한다. 그리고 공개속성과 메서드, 서브클래스가 슈퍼클래스와 상호작용하는 방법등을 안내해야한다.

 

예시)

class Test(object):
"""
Represents a test

class info

Public attributes:
- test_code : test code
- test_result : result
"""
...

 

함수 docstring

 함수의 docstring에서는 첫 줄에 수행하는 일, 다음 줄부턴 함수의 특별한 동작이나, 인수에 대한 내용 또는 반환 값을 설명한다. 또한 호출 시 함수 인터페이스에서 처리해야하는 예외도 설명해야 한다.

 

예시)

def Test_func(code):
"""
Testing target

function info

Args:
- code : String of the target Code

Returns:
- Boolean (True if Test is succeed)
"""
...

 

함수가 인수를 받지 않을 경우는 한 줄의 설명으로도 충분하고 아무것도 반환하지 않는다면 Returns는 생략해도 된다.

만약 함수가 가변인수를 사용할 경우, Args 항목에 *args, **kwargs를 적고 목적을 설명해줘야 한다.

728x90
반응형
728x90
반응형

디렉토리 탐색

 모든 하위 디렉토리 내부 파일까지 포함된 전체 파일의 목록을 가져오기 위해 파이썬으로 코드를 작성하려고 한다.

그런데 디렉토리(또는 폴더) 내부에 하위 디렉토리가 있다면?

그리고 그 디렉토리 내부에 하위 디렉토리가 있는지 없는지 모른다면?

코드를 어떻게 작성해야 될까?

 

먼저 파이썬에서 경로를 다루기위해  os 패키지를 import 했다.

그리고 아래와 같은 디렉토리 구조(주석)를 만들어 둔 뒤 하위 디렉토리 어딘가에 FindMe.txt 파일을 숨겨두었다!

#Find_TMP
#┣━1234
#┗━TEST
#  ┗━TEST1

import os

 

os 모듈 내부의 메소드들을 사용해서 FindMe.txt 파일이 어디에 있는지 찾아보자.

os.listdir() 메소드를 사용하면 입력한 폴더 내부에 존재하는 파일과 디렉토리를 모두 가져올 수 있다.

def findFiles(root):
    files = os.listdir(root)
    for file in files:
        path = os.path.join(root, file)
        if os.path.isdir(path):
            print("Directory :", path)
        else:
            print("File :", path)
      
findFiles("C:/Users/Hwan/Desktop/Find_TMP")

 

Find_dir의 하위 디렉토리인 1234와 TEST는 잘 찾았지만 우리가 원하는 FindMe.txt 파일은 찾지 못했다.

1234와 TEST 내부까지 확인하려면 그리고 내부에 우리가 알지 못하는 디렉토리가 있다면 어떻게 해야될까?

 


 

재귀를 이용한 디렉토리 탐색

  디렉토리 내부에 디렉토리, 그리고 그 내부에 디렉토리 그리고 또 하위 디렉토리.. 만들어둔 구조를 보고 있으면 뭔가 떠오르는 것 같다..! 

 

재귀를 사용해서 모든 경로를 확인해보자.

def findFiles_recursion(path):
    for x in os.listdir(path):
        subdirectory_path = f"{path}/{x}"
        print(subdirectory_path)
        if os.path.isdir(subdirectory_path):
            findFiles_recursion(subdirectory_path)
            
findFiles_recursion("C:/Users/Hwan/Desktop/Find_TMP")

우리가 원하던 FindMe.txt 파일을 드디어 찾았다!

위 구조에선 숨겨져있던 Secret 디렉토리 내부까지 확인이 되었다.

 

하지만 만약 폴더의 구조가 매우 깊다면 재귀를 사용한 함수는 Runtime Error를 뱉는다.

import sys
sys.setrecursionlimit(10000)

물론 이런 코드를 추가하면 좀 더 깊게 탐색할 수는 있지만 스택을 사용하면 더 좋을 것 같다.

 

코드로 작성해보자.

def findFiles_stack(path):
    list_stack = [path] 
    
    while list_stack.__len__():
        cur_path = list_stack.pop()
        
        for x in os.listdir(cur_path):
            _path = os.path.join(cur_path, x)
            if os.path.isdir(_path):
                list_stack.append(_path)
            print(_path)
            
            
findFiles_stack("C:/Users/Hwan/Desktop/Find_TMP")

탐색 순서는 조금 다르지만 이제 깊이에 상관없이 FindMe.txt를 찾을 수 있게 되었다!


 

os.walk

 그런데 사실 파이썬의 os 모듈에서는 위에서 고민했던 내용들을 한번에 해결해줄수 있는 메소드를 제공한다.

for x in os.walk("C:/Users/Hwan/Desktop/Find_TMP"):
    print(x)

하위 디렉토리까지 모든 경로를 찾고 싶을 땐 os.walk 메소드를 쓰도록 하자!

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

FastAPI  (0) 2023.01.12
[Python] 디렉토리 내부의 동일한 파일 찾기  (1) 2022.12.10
[Python] Docstring  (0) 2022.11.27
[python] JWT 모듈  (0) 2022.09.13
[Python] Yahoo_fin 모듈  (0) 2022.09.11
[Python] Paramiko 모듈  (0) 2022.07.07
728x90
반응형

JWT (Json Web Token)

 JWT는 웹 표준(RFC 7519) 으로 두 개체 사이에서 JSON을 사용하여 정보를 안전성 있게 전달해준다.

웹에서 로그인을 하거나 인증을 받게되면 보통 세션을 사용하여 인증 정보를 기록하는데, JWT는 토큰 내부의 Signature에 해당 정보를 기록한다. JWT를 사용할 경우 인증을 위해 웹 브라우저의 세션 공간을 사용하지 않고 인증 여부를 알 수 있기 때문에 확장성이 좋다. 또한 생성 시 권한을 지정할 수 있어 각 토큰별로 기능을 제어할 수 있고 플랫폼에 종속적이지 않다.

 

JWT의 구조는 Header.Payload.Signature로 나뉘어져 있다. Header는 토큰의 typ(해당 토큰의 타입)과 alg(해싱 알고리즘)을 Payload는 토큰에 담을 정보를 그리고 마지막 Signature는 Header와 Paylaod의 Base64 인코딩 값을 시크릿 키와 함께 다시 한번 해싱한 후 인코딩한 값을 가진다.

 

파이썬의 PyJWT 패키지를 사용해서 직접 토큰을 만들고 검증해보자.


 

구현

 파이썬에서의 jwt 사용은 아래처럼 PyJWT를 설치하거나 requirements.txt에 작성해두고 사용할 수 있다.

간단하게 토큰의 생성과 검증하는 기능을 만들어 보았다.

pip install PyJWT

 

import sys
import subprocess

try:
    import jwt

except:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])
    
    import jwt


class Jwt():
    def __init__(self, payloads, secret_key):
        self.payloads = payloads
        self.algorithm = "HS256"
        self.secret_key = secret_key

    def create_token(self):
        return jwt.encode(self.payloads, key=self.secret_key, algorithm=self.algorithm)

    def verify_token(self, token):
        try:
            payload = jwt.decode(token, key=self.secret_key, algorithms=self.algorithm)
        except jwt.ExpiredSignatureError:
            return "토큰 인증 만료"
        except jwt.InvalidTokenError:
            return "토큰 검증 실패"
        
        return payload


if __name__ == '__main__':
    payload = {"id":"hwan"}
    my_jwt = Jwt(payload, "secret")
    token = my_jwt.create_token()

    print("token : ", token)
    print("payload : ", my_jwt.verify_token(token))

 

결과


 

 

후기

 JWT를 직접 구현할 수도 있겠지만 파이썬의 JWT 패키지를 사용한다면 간단하게 토큰을 만들어볼 수 있다. 

위에서 생성한 토큰은 아래 사이트에서도 검증이 가능하다. 직접 구현해볼 땐 아래 사이트를 활용하면 도움이 될 것 같다.

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

728x90
반응형
728x90
반응형

Yahoo_fin 모듈

  yahoo_fin은 시가총액, 배당수익률, 종목에 대한 최신 정보를 제공하는 Python 3 패키지이며, 아래 추가 기능들을 제공한다.

  • 손익 계산서/ 대차 대조표/ 현금 흐름표/ 재무 상태 표
  • 보유자 정보 및 분석가 데이터 스크래핑
  • 가상자산(암호화폐) 데이터
  • 현재 거래일 실시간 주가 및 거래 상위 종목
  • 옵션 가격 및 만료 날짜 검색 모듈
  • 수입 캘린더 기록
  • 금융 뉴스 RSS 피드 스크랩

yahoo_fin은 stock_info module, options module 두 가지 모듈로 구성된다.

자세한 옵션이 궁금하면 아래 링크들에서 찾아보자.

 

https://algotrading101.com/learn/yahoo-finance-api-guide/ 

 

Yahoo Finance API - A Complete Guide - AlgoTrading101 Blog

The Yahoo Finance API is a range of libraries/APIs/methods to obtain historical and real time data for a variety of financial markets and products.

algotrading101.com

https://officejs.files.wordpress.com/2020/05/how-to-download-fundamentals-data-with-python.pdf


 

 코드

pip install yahoo_fin

 

# requirements.txt : requests_html, yahoo_fin 추가

import sys
import subprocess

try:
    from yahoo_fin.stock_info import *

except:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])
    
    from yahoo_fin.stock_info import *


if __name__ == '__main__':
    ticker = "JEPI"

    if ticker in tickers_dow():
        print("dow")
    if ticker in tickers_other():
        print("other")
    if ticker in tickers_sp500():
        print("sp500")
    if ticker in tickers_ftse250():
        print("ftse250") 
    if ticker in tickers_ftse100():
        print("ftse100")
    if ticker in tickers_ibovespa():
        print("ibovespa")
    if ticker in tickers_nasdaq():
        print("nasdaq")

    print(get_data(ticker))

 

 


 

후기

 yfinance, FinanceDataReader 등을 사용봤지만 전체 티커의 목록을 얻어오거나 실시간 데이터를 얻기엔 불편한 점이 있었다. yahoo_fin에선 여러 소스에서 스크랩과 api를 활용하여 데이터를 받아오기 때문에 실시간 데이터와 전체 목록을 얻어오는 기능이 필요하다면 유용하게 사용할 수 있다. 하지만 내부 코드를 보면 위키피디아 등에서도 데이터를 스크랩해오는데.. 누구나 수정할 수 있는 위키피디아의 특성 상 항상 신뢰하긴 어려울 수도 있을 것 같다.

 

728x90
반응형
728x90
반응형

Paramiko

 원격 장치에 대한 보안 연결을 위한 모듈로 SSH/ SFTP 연결 시에 사용한다.

만약 설치 중 에러 발생 시 pip를 업그레이드하고 의존성이 있는 라이브러리를 설치해준다.

 


 

코드

pip install paramiko

 

# requirements.txt - paramiko
import sys
import subprocess

try:
    import paramiko

except:
    subprocess.check_call([sys.executable,'-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable,'-m', 'pip', 'install', '-r', 'requirements.txt'])

	import paramiko


def command_exec(ip, port, user, pw, cmds):
	ssh = paramiko.SSHClient()
	ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
	ssh.connect(ip, port, user, pw)

	stdin, stdout, stderr = ssh.exec_command(";".join(cmds))

	lines = stdout.read()
	res = ''.join(str(lines))

	return res
    
    
if __name__ == "__main__":
	cmds = ["whoami", "echo hello", "reboot"]
	command_exec("123.123.123.123", 22, "user", "1234", cmds)

 


 

후기

 기능은 잘 동작하지만 여러줄의 명령어를 실행하거나 세션을 유지하여 터미널 처럼 사용하기 어려운 것 같다.(방법을 찾아보고는 있음) 현재는 join 함수로 명령어들을 ;로 묶어 한번에 서버에서 실행시키도록 함수를 작성하였다.

 

728x90
반응형
728x90
반응형

파이썬의 데코레이터란?

먼저 Decorate는 '장식하다' 라는 의미가 있고, 따라서 직역하면 '장식자'라는 의미가 된다. (구글 번역기에서는 a person who decorates something. 로 정의되어 있다.)

파이썬에서도 원래 뜻과 비슷한 의미로 사용되는데 @ 기호로 표현 할 수 있으며, 클래스나 메소드를 정의할 때 많이 사용되어 진다.

데코레이터는 직접 정의하여 사용하거나 미리 정의된 내용을 가져와 사용이 가능하다.

(정의된 데코레이터는 @property, @classmethod, @staticmethod 등이 있다.)

 

데코레이터를 작성하면 원본 메소드의 내용을 수정하지 않고 여러 기능을 추가할 수 있게 된다.

  • 메소드(함수)의 실행시간 측정
  • 실행과 종료에 로그 기능 추가
  • ...

메소드 데코레이터 정의하기

데코레이터는 크게 클래스 데코레이터메소드 데코레이터로 나눠진다.

메소드 데코레이터는 메소드를 장식하기 위한 데코레이터로 기본적인 형태는 아래 코드를 따르게 되며,

def decorator_1(func):
	def wrapped_func():
		func() 
    return wrapped_func()

 

만들어진 데코레이터의 사용은 아래 코드와 같다.

# 메소드 데코레이터 정의
def decorator_1(func):
	def wrapped_func():
		print("start")
		func() 
		print("end")

	return wrapped_func

# 사용
@ decorator_1
def test_func():
	print("logic")

test_func()

 

 

위 사진은 데코레이터를 사용한 결과인데 내용을 보면 가장 마지막 줄에 test_func()을 호출했지만 decorator_1에 내부에 정의된 wrapped_func의 기능이 수행된 것을 볼 수있다.

 

하지만 데코레이터를 사용하는 함수의 매개변수를 바꾸고 실행하면 TypeError가 발생한다.

정상적으로 메소드에 인수를 받아 사용하려면 데코레이터의 수정이 조금 필요하다.

 

아래 코드를 보면 wrapped_func에 *args가 매개변수로 추가되었다.

*을 사용하여 non-keworded arguments 형식으로 인수를 받을 수 있는데 이렇게 사용하면, 키워드가 없는 가변 인수가 되어 여러개의 인수를 받는 것이 가능해진다. (만약 메소드에 키워드가 필요하다면 **(keworded arguments)를 사용) 

def decorator_1(func):
	def wrapped_func(*args):
		print("start - ", func.__name__)
		func(*args) 
		print("end - ", func.__name__)

	return wrapped_func


@ decorator_1
def test_func(str_var, int_tmp, a, b, c):
	print(str_var,  int_tmp, a, b, c)


test_func("test", 12, 1, 2, 3,)

 

위 코드에서 매개변수를 받아 출력을 했지만, test_func 함수의 결과 값은 받아볼 수 없다.

wrapped_func 내부에서 func의 결과 값을 받아 return 해줬다.

def decorator_1(func):
	def wrapped_func(*args):
		print("start - ", func.__name__)
		ret= func(*args) 
		print("end - ", func.__name__)
		return ret
	return wrapped_func


@ decorator_1
def test_func(str_var, int_tmp, a, b, c):
	print(str_var,  int_tmp, a, b, c)
    return a + b


print(test_func("test", 12, 1, 2, 3,))

클래스 데코레이터

 

위에서 작성한 데코레이터를 클래스 내에 넣어 작성해보았다.

메소드 데코레이터와 동일한 기능을 수행하는 것을 볼 수 있다.

class myClass:
	def myClass_LoggingDecorator(func):
		def wrapped_func(*args):
			print("start - ", func.__name__)
			func(*args) 
			print("end - ", func.__name__)
		return wrapped_func

	@ myClass_LoggingDecorator
	def test_func(str_var, int_tmp, a, b, c):
		print(str_var,  int_tmp, a, b, c)


myClass.test_func("test", 12, 1, 2, 3,)


클래스 데코레이터 - 활용

import time
import datetime

class myClass:
	def myClass_RunningtimeDecorator(func):
		def wrap(*args):
			start_r = time.perf_counter()
			start_p = time.process_time()

			ret = func(*args)

			end_r = time.perf_counter()
			end_p = time.process_time()
            
			elapsed_r = end_r - start_r
			elapsed_p = end_p - start_p

			print(f'{func.__name__} : {elapsed_r:.6f}sec (Perf_Counter) / {elapsed_p:.6f}sec (Process Time)')
			return ret
		return wrap

	def myClass_LoggingDecorator(func):
		def wrapped_func(*args):
			file_name = f"log_{datetime.datetime.today().strftime('%Y-%m-%d')}.txt"

			File = open(file_name, "w")
			File.write(f"start - {func.__name__}, DateTime : {datetime.datetime.now()}\n")

			ret = func(*args) 
			
			File.write(f"end - {func.__name__}, DateTime : {datetime.datetime.now()}\n")
			File.close()

			return ret
		return wrapped_func

	#@ myClass_RunningtimeDecorator
	@ myClass_LoggingDecorator
	def test_sum(str_var, a, b):
		print(str_var, a + b)
		return a + b
        

print ("res2 :", myClass.test_sum("res1 :", 1, 2))

LoggingDecorator / RunningtimeDecorator
log file

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[python] JWT 모듈  (0) 2022.09.13
[Python] Yahoo_fin 모듈  (0) 2022.09.11
[Python] Paramiko 모듈  (0) 2022.07.07
[Python] min, max 함수  (0) 2022.03.10
[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
728x90
반응형

min (max) 함수

파이썬에서는 여러 대상들(리스트 등) 중 가장 큰 값 또는 가장 작은 값을 구하는 함수가 있다.
min, max 함수인데, 아래 방법을 사용하면 이런 함수들을 좀 더 잘(?) 활용할 수 있다.

함수 Parameter에 key=func 주기

list_num = [1, 2, 5, 4, 5, 5, 6, 7, 8, 1]

print(max(list_num, key=list_num.count))

# count가 가장 많은 5가 출력


위 코드는 list_num.count를 list_num을 대상으로 실행하고, 해당 값들의 최대값을 출력한다.
따라서 list_num 내부에 가장 개수가 많은 5가 출력된다.


728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Yahoo_fin 모듈  (0) 2022.09.11
[Python] Paramiko 모듈  (0) 2022.07.07
[Python] 데코레이터 (@, Decorator)  (0) 2022.03.21
[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
728x90
반응형

1. lambda 표현식 요약

- 함수를 하나의 식으로 표현한 것으로 다른 함수의 매개변수로 전달이 가능함

- 함수의 이름이 없기 때문에 익명 함수라고도 불림

- 함수 표현식 사용할 경우 속도가 저하된다고 함 (정확하지 않음, 재확인 필요)

 

2. 사용법 

# Case 1. lambda 함수 정의 후 매개변수 전달
function_lambda = lambda x : x + 1
print("result : ", function_lambda(1))
# result : 2

# Case 2. 한번에 매개변수 전달
print("result : ", (lambda x : x + 1)(1))
# result : 2

# Case 3. 외부 변수 활용
y = 1
print("result : ", (lambda x : x + y)(1))
# result : 2

# Case 4. 여러개의 매개변수 전달
print("result : ", (lambda x, y : x + y)(1, 1))
# result : 2

# Case 5. max 함수의 매개 변수로 사용
print(max((lambda x : [i for i in range(1, x+1)])(10)))
# 10

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Paramiko 모듈  (0) 2022.07.07
[Python] 데코레이터 (@, Decorator)  (0) 2022.03.21
[Python] min, max 함수  (0) 2022.03.10
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
728x90
반응형

패키지 설치

sys와 subprocess를 활용하여 pip를 호출한다. 

아래 코드를 사용할 환경에 python과 pip가 설치되어 있고, 인터넷이 연결되어 있어야 작동한다.

 

import sys
import subprocess

try:
    # 없는 모듈 import시 에러 발생
    import pandas
except:
    # pip 모듈 업그레이드
    subprocess.check_call([sys.executable,'-m', 'pip', 'install', '--upgrade', 'pip'])
    # 에러 발생한 모듈 설치
    subprocess.check_call([sys.executable,'-m', 'pip', 'install', '--upgrade', 'pandas'])
    # 다시 import
    import pandas

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] 데코레이터 (@, Decorator)  (0) 2022.03.21
[Python] min, max 함수  (0) 2022.03.10
[python] lambda 표현식  (0) 2022.01.07
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
728x90
반응형

1. 조회 가능 범위

  • 한국거래소(KRX)에 상장된 주식종목 리스트와 코넥스(비상장)에 있는 주식종목 리스트: 'KRX', 'KOSPI', 'KODAQ', 'KONEX'
  • 글로벌 주식종목 리스트: 'NASDAQ', 'NYSE', 'AMEX' and 'S&P500', 'SSE'(상해), 'SZSE'(심천), 'HKEX'(홍콩), 'TSE'(도쿄)
  • 한국거래소의 상장폐지종목과 관리종목 리스트: 'KRX-DELISTING'(상장폐지종목), 'KRX-ADMINISTRATIVE' (관리종목)
  • 한국, 미국, 일본의 ETF 리스트: 'KR', 'US', 'JP'
  • 주가(KRX): '005930'(삼성전자), '091990'(셀트리온헬스케어) ...
  • 주가(Word wide): 'AAPL', 'AMZN', 'GOOG'
  • 지수: 'KS11'(코스피지수), 'KQ11'(코스닥지수), 'DJI'(다우존스지수), 'IXIC'(나스닥지수), 'US500'(S&P 500지수) ...
  • 환율: 'USD/KRX', 'USD/EUR', 'CNY/KRW' ... (조합가능한 화폐별 환율 데이터 일자별)
  • 가상화폐 가격 데이터: 'BTC/USD' (Bitfinex), 'BTC/KRW' (Bithumb)

출처: https://psystat.tistory.com/113 [아카이브]

 

 

2. 달러 환율 계산기

import FinanceDataReader as fdr
import matplotlib.pyplot as plt
from datetime import date, datetime

print(fdr.__version__)
df = fdr.DataReader("USD/KRW", "2020")['Close']
print(df)

a = [date(2020, 1, 1), date(datetime.now().year, datetime.now().month, datetime.now().day)] # 시간
b = [min(df), max(df)] # 원화
c = [sum(df)/len(df), sum(df)/len(df)]

print(df[-1], sum(df)/len(df))

plt.plot(a, c)
plt.plot(df)
plt.show()

2020년 1월 1일부터 현재까지의 환율 그래프

- 현재 환율인 '1154.28원/달러'는 약 2년동안의 평균 환율인 '1157.93원/달러'보다 낮다는 것을 알 수 있다.

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] min, max 함수  (0) 2022.03.10
[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
728x90
반응형

1. 개요

pykrx : https://github.com/sharebook-kr/pykrx

- KRX 거래소 서버에서 값 받아옴

- 국내 KOSPI, KOSDAQ, KONEX 정보 확인 가능

 

sharebook-kr/pykrx

KRX 주식 정보 스크래핑. Contribute to sharebook-kr/pykrx development by creating an account on GitHub.

github.com

 

2. 설치

pip install pykrx

 

3. 코드

from pykrx import stock

# 원하는 조건의 티커 목록 얻어오기, market 설정 안해줄 경우 기본은 KOSPI
# 아래 조건은 2021년 6월 1일 기준의 KOSDAQ 상장사들의 티커를 받아옴
tickers = stock.get_market_ticker_list("2021-06-01", market="KOSDAQ") #yyyy-MM-dd

# 각 티커들의 종목이름을 확인
for ticker in tickers:
	str_종목이름 = stock.get_market_ticker_name(ticker)
	
    # 시작일~종료일 사이 특정 티커의 OHLCV 정보를 한달 단위로 받아옴 (DateFrame)
    df = stock.get_market_ohlcv_by_date("20210101", "20210601", ticker, "m")
	print(df.head(6))

 ** 더 자세한 정보는 위 링크 참조

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 원 나누기  (0) 2016.10.03
728x90
반응형

1. 개요

yfinance : https://pypi.org/project/yfinance/

- API와 티커 값을 사용해서 해외 주가 정보를 받아올 수 있다.

- 야후에서 제공 (무료)

- 특정 종목(티커)에 해당하는 과거 시점의 모든 데이터를 얻어올 수 있음

- Date, Open, High, Low, Close, Volume, Dividends, Stock Split 정보를 포함

- 애널리스트 평가 정보 가져오기 가능

 

yfinance

Yahoo! Finance market data downloader

pypi.org

 

2. 설치

pip install yfinance

 

3. 사용

yf_GoogleA = yf.Ticker("GOOGL") # AAPL, TSLA, GOOGL ...
yf_Tesla = yf.Ticker("TSLA")
yf_Apple = yf.Ticker("AAPL")

print(yf_GoogleA.dividends) # 배당 내역
print(yf_GoogleA.splits) # 주식분할 내역
print(yf_GoogleA.recommendations) # 애널리스트 분석 정보

# from datetime import *
# 테슬라의 2020-01-01부터 현재 시점까지 데이터를 1주 단위로 가져옴
yf_Tesla_hist = yf_Tesla.history(start="2020-01-01", end=dateTime.now, interval="1wk")

# 장마감 시의 주가 정보만 가져오기
yf_Apple_hist = yf_Apple.history(interval="1wk")['Close']

# 출력, 리스트로 변경하여 인덱스로 데이터 처리가 가능
print(list(yf_Apple_hist)[:])

# import matplotlib.pyplot as plt ,그래프 그리기
plt.plot(yf_Apple_hist)
plt.show()
728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 원 나누기  (0) 2016.10.03
[Python] 돌림판  (0) 2016.10.03
728x90
반응형

1. 개요

pycryptodome : https://pycryptodome.readthedocs.io/en/latest/

- 파이썬에서 RSA, hash 등 암호화 관련 기능 제공

 

Welcome to PyCryptodome’s documentation — PyCryptodome 3.9.9 documentation

 

pycryptodome.readthedocs.io

 

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] 원 나누기  (0) 2016.10.03
[Python] 돌림판  (0) 2016.10.03
[Python] 키로거 + 스크린샷  (0) 2016.09.18
728x90
반응형

1. 개요
 
- 돌림판에 사용될 원 그리기


2. 코드

# -*- coding: utf-8 -*-
import sys
import pygame
import math
from pygame.locals import *

PI = 3.14159265359
R = 200
screenX = 410 
screenY = 410
Ox = screenX / 2
Oy = screenY / 2

# 초당 프레임수를 정의
TARGET_FPS = 30
clock = pygame.time.Clock()

# 색 정의
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)

# 실수를 더하기 위해서 만들어줌
def myrange(start, end, step):
    r = start
    while(r<end):
        yield r
        r += step

# 인원 수 를 입력받아서 같은 각도로 나눠줌
def auto_line(size):
  a = 360.0 / size # 1명 각도
  # cnt = 0
  tmp = 0 # 각도 누적
  x = 0.0
  y = 0.0
  
  for tmp in myrange(0, 360, a):
      # cnt = cnt + 1

      # 간단한 수학 공식으로 좌표 Get
      x = R * math.cos(math.radians(tmp))
      y = R * math.sin(math.radians(tmp))
      
      #print "[%d] tmp : %.2lf, x : %lf, y : %lf" %(cnt, tmp, x, y)
      pygame.draw.line(screen, BLACK, (Ox, Oy), (Ox+x, Oy+y), 2)


# 라이브러리 및 디스플레이 초기화
pygame.init()

num = raw_input("num : ")
screen = pygame.display.set_mode((screenX, screenY), DOUBLEBUF)
pygame.display.set_caption('Hello World!')  # 타이틀바의 텍스트를 설정

screen.fill(WHITE)
#pygame.draw.line(screen, RED, (Ox, Oy-R*10), (Ox, Oy+R*10), 1) # y
#pygame.draw.line(screen, RED, (Ox-R*10, Oy), (Ox+R*10, Oy), 1) # x

# 메인 루프
while True:
  for event in pygame.event.get():
    # 이벤트를 처리하는 부분
    if event.type == QUIT:
      pygame.quit()
      sys.exit()

  auto_line(int(num)) # 입력받은 인원 수로 원을 나눠줌
  pygame.draw.circle(screen, BLACK, (Ox, Oy), R, 2) # 외부 원
  pygame.draw.circle(screen, BLACK, (Ox, Oy), 20) # 중심 원
  pygame.display.flip()  # 화면 전체를 업데이트
  clock.tick(TARGET_FPS)  # 프레임 수 맞추기

 

생성된 돌림판 이미지 - Alt+Prtsc 으로 캡쳐 후 사용

 

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 돌림판  (0) 2016.10.03
[Python] 키로거 + 스크린샷  (0) 2016.09.18
728x90
반응형

1. 개요

 - pygame 라이브러리를 사용하여 윈도우를 그림

 - 스페이스 바로 돌림판의 회전과 정지를 정함

 - 정지 시 천천히 멈춤 (회전각을 0까지 빼줌)

 

2. 코드

 
#-*- coding: utf-8 -*-
import sys
import pygame
from pygame.locals import *
import time

# 초당 프레임수를 정의
TARGET_FPS = 30
clock = pygame.time.Clock()

# 색 정의
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)

# 라이브러리 및 디스플레이 초기화
pygame.init()
screen = pygame.display.set_mode((600, 400), DOUBLEBUF) # 윈도우 크기 및 속성 설정
pygame.display.set_caption('돌림판')  # 타이틀바의 텍스트를 설정

# 이미지 파일을 로딩
img = pygame.image.load('images.png') # 돌림판 이미지
img2 = pygame.image.load('images2.jpg') # 화살표

degree = 0
flag = True 
rad = 100
stop_time = 3 # 돌림판이 멈출 때까지의 시간 (클수록 빨리 멈춤)

# 메인 루프
while True:
  for event in pygame.event.get():
    # 이벤트를 처리하는 부분
    if event.type == QUIT:
      pygame.quit()
      sys.exit()

    # 키보드 이벤트 처리
    if event.type == KEYDOWN:
      # 스페이스 -> 토글
      if event.key == 32:
          if flag == True:
              flag = False
          elif flag == False:
              flag = True
              rad = 100

  # 게임의 상태를 화면에 그려주는 부분
  screen.fill(WHITE)
  
  # 이미지 파일 회전하여 그리기
  x = 350
  y = 200
  
  rotated = pygame.transform.rotate(img, degree) # degree 만큼 회전
  rect = rotated.get_rect()
  rect.center = (x, y)
  screen.blit(rotated, rect)

  # 플래그의 상태가 True면 회전, False면 천천히 정지
  if flag == True:
      degree += rad
  elif flag == False:
      if rad > 0:
          rad -= stop_time
          degree += rad
          

  screen.blit(img2, (70, 180)) # 화살표 그리기
  pygame.display.flip()  # 화면 전체를 업데이트
  clock.tick(TARGET_FPS)  # 프레임 수 맞추기

 

3. 결과

 

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 원 나누기  (0) 2016.10.03
[Python] 키로거 + 스크린샷  (0) 2016.09.18

+ Recent posts