Skip to content

Python:Isolation

파이썬 격리 방법에 대한 나의 뻘짓 기행기...

Categories

  • PEP 432 - Restructuring the CPython startup sequence (CPython 시작 시퀀스 재구성)
  • PEP 405 - Python Virtual Environments
  • process-isolation - Process Isolation in Python - Elegant process isolation in pure python

나의 뻘짓 기행 순서

  1. c에서 cpython으로 격리했다.
  2. python에서 exec 빌트인 함수 쓰는걸로 바꿈.
  3. venv 설치해서 subprocess 로 실행.

격리된 파이썬과 통신 방법

  1. grpc 로 통신.
  2. grpc+json으로 통신. -> 대용량 데이터 통신이 느리더라.
  3. grpc+json+sharedmemory으로 통신. -> numpy직렬화 때문에 위한 bytes 데이터 인코딩을 하는데 json은 bytes 데이터 지원안해 문제더라.
  4. grpc+msgpack+sharedmemory으로 통신.

완벽한 격리 및 통신 위한 뻘짓 진행

  1. 처음엔, 원본 python/reccasyncio.subprocess 로 실행, 직접 python 안에서 통신: 문제는, 원격 환경 지원되지 않음.
  2. 원본 python/recc <-- 통신방법은? --> 격리된 venv subprocess: 문제는, 격리된 venv 에는 통신 모듈이 없다.
  3. 원본 python/recc <-- grpc --> 격리된 venv subprocess: 격리된 venv에 grpc가 필요하다.
  4. 원본 python/recc <-- grpc --> 원본 python subprocess 에서 venv의 site-packages 디렉토리만 sys.path에 추가: 문제는 원본 python의 site-packages 가 공유된다.
  5. 원본 python/recc <-- grpc --> 격리된 venv subprocess에서 원본 python의 site-packages 디렉토리만 sys.path에 추가: 문제는 정상작동 안함.
  6. 원본 python/recc <-- grpc --> 원본 python subprocess 에서 venv원리대로 sys 패키지의 변수를 context change 했다: 문제는 async/await 구문이 비동기로 작동하여 context change 했을 경우 전역 sys 패키지에 영향을 미쳐, 정상적으로 작동하지 않는다.
  7. 원본 python/recc <-- grpc --> 격리된 venv subprocess에서 recc관련 종속성 패키지 모두 설치.
    • 종속성 파일들은 미리 pip download --dest /download/path -r requirements.txt로 받아놓고
    • pip install --no-index -f /download/path -r requirements.txt로 offline 설치했다.
    • recc는 offline 을 상정하여, {venv-site-packages}/__recc_local__ 에 원본 site-packages 에 이미 설치된 전체 파일을 복사하고,
    • {venv-site-packages}/recc.pth 파일에 설치된 경로 추가하여, 별도의 작업 없이 자동으로 recc 모듈이 인식되도록 하였다. (단, pip로 설치한건 아니라, pip list명령으로 출력되지 않는다)
      • *.pth 규칙에 대한 자세한 설명은 Python:site 항목 참조.
    • 이걸로 해결..

loader 는 뭐지?

Python:importlib#BuiltinImporter 참조.

임포트 순서가 중요한가?

venv이 중요?

virtualenv 구현체 확인해보자

virtualenv#activate_this.py 확인

See also

Favorite site