[ Python ] 사용한 package 모두 저장해서 다른 곳에서 그대로 사용하는방법

2019. 8. 12. 21:04분석 Python/구현 및 자료

728x90

최근에 사용한 패키지 상태를 그대로 유지하면서, 다시 사용해야 할 때 전달해야 하는 이슈가 있었다.

그래서 처음에는 pickle로 저장해봤는데, 안되서 이유를 찾아보니 밑에 글에 잘 정리된 게 있으니 확인해보시길 바란다!

 

사실 R에서는 .RData로 몽땅 집어넣을 수가 있는데, 이것이 되는지가 궁금했다

 

https://lovit.github.io/analytics/2019/01/15/python_dill/

 

Python dill 로 class definition 까지 binary 로 저장하기

파이썬으로 작업을 할 때, 사용자가 정의하는 클래스 인스턴스를 저장할 일들이 있습니다. 예를 들면 namedtuple 을 이용한 데이터 타입이라던지, PyTorch 에서 nn.Module 을 상속받은 모델들이 그 예입니다. 물론 site-packages 폴더에 설치된 클래스들은 pickle 을 이용하여 저장/로딩에 문제가 없지만, 때때로 패키지에 없는 클래스를 만들일이 있습니다. 이처럼 serializable 하지 않은 변수들은 pickle 을 이용하여

lovit.github.io

결론은  serializable 하기 때문에 안된다고 한다!

 

그래서 좌절하고 있다가 위에서 알켜준 방법인 dill을 해보려고 했다!

dill 패키지는 serializable 하지 않은 값들도 손쉽게 binary 로 저장이 가능합니다. 

 

일단 이것은 저장이 되었다!

하지만 내가 궁극적으로 원하는 것은 모든 패키지를 찾아서 사전에 때려놓고, 그 네이밍을 유지한 상태로 그대로 사용하는 것이었다. 

 

그래서 시도를 하고 되서 공유를 한다!

 

일단 시도를 해볼것은 다음과 같다

1. numpy package

2. 내가 정의한 함수에다가 거기다가 import numpy 해보기

3. class 정보

 

이 3개를 사전에 넣어서 그대로 사용하려고 한다.

import numpy as np

def add(x,y) :
    import numpy as np
    def mat(x,y) :
        return x*y*2
    return x + mat(x,y) + np.random.normal(size= 1)

class Test :
    def na(a) :
        return a

 

일단 전체 패키지 list를 확인하고자 다음과 같은 코드를 만들었다.

import re
package_list = {}
for i in list(locals().keys()) :
    if re.search("^_|ipython" , i) is None :
        if re.match("In|Out|exit|quit|i" , i ) is None :
            
            if re.search("^<function|^<module|^<class" , str(locals()[i])) is not None :
                package_list[i] = locals()[i]

난 이것을 통째로 저장하고 싶은 것이다!

 

일단 한개씩 불러오면 다음과 같이 잘 작동하는 것을 알 수 있다.

그러면 이제부터 dill 패키지를 이용해서 테스트!

 

일단 해보니 안정적으로 잘 저장되고 잘 불러와졌다.

과연 그러면 똑같이 작동할까?

import dill


## 저장!
with open("./save_add.pkl" , "wb") as f:
    dill.dump(package_list , f)


## 불러들이기!!
with open('./save_add.pkl', 'rb') as f:
    f = dill.load(f)
    
    

-작동 완료 끝-

728x90