서로 다른 두 개의 Python 인터프리터 인스턴스 사이에서는, 정보를 어딘가 외부에 저장하지 않고는 공통 데이터를 공유할 수 없습니다. 이를 해결하려면 네트워크/소켓 통신을 사용하거나 임시 파일을 활용해야 합니다.
가장 간단한 방법: 파일을 이용한 데이터 공유
가장 손쉬운 방식은 파일을 매개체로 삼아 데이터를 공유하는 것입니다. Python의 pickle 모듈을 사용하면 객체를 파일로 직렬화하여 저장하고, 다른 스크립트에서 해당 파일을 열어 역직렬화(deserialize)함으로써 원본 객체를 그대로 복원할 수 있습니다.
1. 데이터를 생성하는 스크립트 (producer.py)
# producer.py
import pickle
shared = {"Foo": "Bar", "Parrot": "Dead"}
with open("shared.pkl", "wb") as fp:
pickle.dump(shared, fp)
pickle.dump() 함수는 파이썬 객체를 바이트 형태로 변환하여 파일에 기록합니다. with 문을 사용하면 작업이 끝난 후 파일이 자동으로 닫히므로 안전합니다.
2. 데이터를 소비하는 스크립트 (consumer.py)
# consumer.py
import pickle
with open("shared.pkl", "rb") as fp:
shared = pickle.load(fp)
print(shared["Foo"]) # 출력 결과: Bar
pickle.load() 함수는 파일에 저장된 직렬화된 데이터를 읽어 원래의 파이썬 객체로 되돌려줍니다. 실행 결과로 Bar가 출력되며, 다른 프로세스에서 생성된 딕셔너리를 그대로 사용할 수 있게 됩니다.
활용 시 주의 사항
- 바이너리 모드 사용: pickle 파일은 반드시
'wb'(쓰기)와'rb'(읽기)처럼 바이너리 모드로 열어야 합니다. - 보안 문제:
pickle은 신뢰할 수 없는 출처의 데이터를 로드할 때 임의 코드 실행 위험이 있으므로, 외부 입력값에는 사용하지 않는 것이 좋습니다. - 대안: 단순한 텍스트 데이터라면
json모듈을 사용하는 것이 더 안전하고 범용적입니다. 실시간 동기화가 필요하다면 소켓 통신이나 데이터베이스(Redis 등)를 고려할 수 있습니다.
이처럼 pickle과 파일 입출력만으로도 여러 Python 스크립트 간에 복잡한 객체를 손쉽게 공유할 수 있습니다.