프로젝트를 릴리즈 하다보면 다른사람에게 보이고싶지 않은 코드가 종종 있을 것이다.

 

그럴 경우 파이썬 파일을 라이브러리화 하여 코드를 공개하지 않는 방법이 있는데 그 중 한 가지 방법은 nuitka 를 사용하여 *.py 파일을 *.so (mac, ubuntu 기준) 으로 바꾸는 것이다

 

간단하게 테스트 코드를 짜봤다

# LibraryClass.py

class LibraryClass:
    def __init__(self):
        pass

    def add_number(self, a, b):
        return a + b
# main.py

from LibraryClass import *

if __name__ == "__main__":
    inst = TestClass()

    result = inst.add_number(10, 20)
    print(result)

 

LibraryClass.py 의 add_number 함수는 두 수를 파라미터로 받고 합을 return 해주는 함수고

main.py 는 간단하게 두 수를 add_number 함수에 넘겨주고 return 을 받아 그 값을 출력해주는 역할을 한다

 

당연히 결과는 30이 출력이 되겠지만 우리는 LibraryClass.py 파일을 라이브러리화 하는것이 목적이다

 

Nuikta 를 사용하려면 해당 패키지가 설치되어있어야 한다.

pyinstaller 와 같이 파이썬 pip 로 설치가 가능하니 준비시간도 매우 짧은 편이다

만약 설치되어 있지 않다면 아래의 명령어로 설치해 주도록 한다

$ pip install nuitka

nuitka 가 준비되었다면 명령어 한 줄로 바로 라이브러리화 할 수 있다.

 

파일 하나를 라이브러리 파일로 만들어 주는 명령어는 아래와 같다

$ python -m nuitka --module *.py

 

끝나면 *.build, *.pyi, *.so 이렇게 3개의 파일이 만들어 진다

 

 

 

 

*.pyi, *.build 는 필요 없으니 삭제하고 *.so 파일만 남겨둔다  *.so 파일 위치는 기존의 *.py 가 위치하고 있던 곳에 위치하고 있으면 된다

 

 

블로그 이미지

우송송

,

Pycharm 을 이용해 개발하다 보면 파이썬 코드가 여기저기 생기고 각 파이썬 파일마다 main 함수가 있을 것이다.

 

그런데 각 파이썬 파일들이 하나의 동일한  파일을 참조하게 되는 경우 (tensorflow model, sample image 등) 각 파이썬 파일마다 경로를 일일이 수정해줘야 하는 불편함이 있다.

 

다른 방법은 생각해보지 않았지만 그냥 단순하게 프로젝트 폴더를 root 로 삼으면 모든 파일에 대해 동일한 경로 값으로 접근이 가능하다.

 

get_root_dir.py



from pathlib import Path

def get_project_root() -> Path:
    return str(Path(__file__).parent.parent) + '/'

 

이렇게 프로젝트의 root 경로를 return 하는 간단한 파일을 작성해두고 import 해서 사용하면 각 파이썬 코드마다 참조하는 파일들의 경로를 동일하게 줄 수 있다.

 

아래는 예시 코드

from get_root_dir import get_project_root

ROOT_DIR = get_project_root()


model_path = ROOT_DIR + "/models/frozen_inference_graph.pb"
labelmap_path = ROOT_DIR + "/models/labelmap.pbtxt"

 

블로그 이미지

우송송

,
import pymysql.cursors

url = 'xxx.xxx.xxx.xxx'
conn = pymysql.connect(host=url, port=3306, user='root', password='1234', db='eximdb', charset='utf8')
curs = conn.cursor()

sql = 'show tables'
curs.execute(sql)

result = curs.fetchall()
print(result)
결과 : (('el_connect_inf',), ('qrtz_blob_triggers',))

 

 

결과를 Dictionary 형식으로 받고 싶으면 mysql.connect 의 파라미터에

 

cursorclass=pymysql.cursors.DictCursor

 

를 추가한다.

import pymysql.cursors

url = 'xxx.xxx.xxx.xxx'
conn = pymysql.connect(host=url, port=3306, user='root', password='1234', db='eximdb', charset='utf8', cursorclass=pymysql.cursors.DictCursor)
curs = conn.cursor()

sql = 'show tables'
curs.execute(sql)

result = curs.fetchall()
print(result)
결과 : [{'Tables_in_eximdb': 'el_connect_inf'}, {'Tables_in_eximdb': 'qrtz_blob_triggers'}]

 

연결방법은 내부, 외부 mysql 동일하다.

블로그 이미지

우송송

,