2015-02-02 3 views
2

3 개의 모듈과 lib 폴더가 포함 된 GAE 앱이 있습니다. lib 폴더에서 타사 라이브러리를 가져 오려고했습니다. GAE는 ImportError를 발생시킵니다.모듈 내에서 lib 폴더를 가져 오는 방법

./lib와 ./Module_1/lib 및 ./Module_2/lib을 기호로 연결하고 각 모듈에 appengine_config.py를 심볼릭 링크하여 작동시킬 수도 있습니다. 그러나 이것을하는 것은 정말 더러워 보였습니다.
module_1 및 module_2에서 app_root/lib를 가져 오는 더 명확한 방법이 있습니까?

이것은 유망한 것으로 보였지만 (https://cloud.google.com/appengine/docs/python/config/appconfig#Python_app_yaml_Includes), include.yaml에 무엇을 넣어야할지 모릅니다. 내가 할

module_1.py 또는 module_2.py에서
-- App Root/ 
    -- Module_1/ 
     module_1.yaml 
     module_1.py 

    -- Module_2/ 
     module_2.yaml 
     module_2.py 

    -- lib/ 
     -- cloudstorage/ 
      .. 
     -- 3rd_library_1/ 
      .. 
      .. 
     -- 3rd_library_2/ 
      .. 
      .. 

    appengine_config.py 
    main.py (default module) 
    app.yaml(default module) 
    queue.yaml 
    dispatch.yaml 

import cloudstorage as gcs 

은 그러나

ImportError: No module named cloudstorage 

불평이 main.py에서 가져올 때, 그것을 잘 작동합니다. appengine_config.py에서

는 : module_1.py에

sys.path in main.py : 
[ 
    '/base/data/home/apps/s~my-app/2.381942946570489905', 
    '/base/data/home/apps/s~my-app/2.381942946570489905/lib', 
    ... 
    ... 
] 

의 sys.path :

[ 
    '/base/data/home/apps/s~my-app/module_1:2.381942955973772449',  
    '/base/data/home/runtimes/python27/python27_dist/lib/python27.zip', 
    ... 
    ... 
    ] 
+0

, 그래서 당신'lib' 폴더를해야 ... 쉽게 테스트/배포를 도와주는 메이크를 썼다 귀하의 모듈 내부에 있어야합니다. 심볼릭 링크를 만드십시오. –

답변

3
import os 
import sys 

# Add ./lib to sys path 
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib')) 

또한 main.py에서 sys.path를 인쇄하려고

크레딧은 Google Cloud Platform 기술 솔루션 대표로 아담 :

모듈의 문서화 명시 적으로 언급되지 않을 수도 있습니다,하지만 폴더 '으로 Module1이', '모듈 2'뿐만 아니라 기본 모듈은 실제로 개별 인스턴스에 별도의 파이썬 가상 환경 내에서 실행하고 자기 포함해야합니다. 그들은 위의 로컬 파일 시스템에있는 디렉토리를 볼 수없고 'default.py'는 각 모듈 디렉토리에서 아무 것도 볼 수 없습니다. 전체 폴더 트리가 각 모듈 인스턴스에 복사되지 않습니다.

그는 심볼 링크 대신 ./lib를 각 모듈에 복사하는 것이 좋습니다.

나는 그 아이디어를별로 좋아하지 않는다.

먼저이 모듈은 기본 클래스를 공유하므로 복제는 실제로 반 패턴입니다.

두 번째로, lib 폴더를 복사하면 유닛 테스트가 손상 될 수 있습니다. 단위 테스트는 실행될 수있는 모든 단위 테스트를 실행하려고 시도하며, 디렉토리를 명시 적으로 제외시키지 않아도됩니다. 하루의 끝에서

, 나는

# Create simlinks before deployment. 
deploy: mksimlnks 
    appcfg.py --oauth2 update $(CURDIR)/app.yaml 
    appcfg.py --oauth2 update $(CURDIR)/MODULE_1/module_1.yaml 
    appcfg.py --oauth2 update $(CURDIR)/MODULE_2/module_2.yaml 
    appcfg.py --oauth2 update_queues $(CURDIR) 

mksimlnks: 
    ln -s $(CURDIR)/lib $(CURDIR)/MODULE_1/lib 
    ln -s $(CURDIR)/lib $(CURDIR)/MODULE_2/lib 

# Need to remove symlinks before unittest 
# or unit test will explode. 
test: rmsimlnks 
    nosetests --exclude-dir=lib --with-gae -w $(CURDIR) --with-coverage --cover-html 

# Remove all symlinks 
rmsimlnks: 
    rm -rf $(shell find * -type l) 

# remove symlinks and other stuff 
clean: rmsimlnks 
    rm -f $(shell find * -name *.pyc) 
    rm -f $(shell find * -name .DS_Store) 
    rm -f .coverage 
    rm -rf $(CURDIR)/cover 
* .yaml 파일이 포함 만 폴더 GAE에 업로드됩니다
관련 문제