2011-11-07 2 views
5

새로운 Python 2.7 런타임을 threadsafe 모드로 사용하고 JinJ2 1.6.0 시험판 SDK를 사용하여 Pyramid를 실행하려고합니다. here으로 앱을 수정했습니다. 즉, runtime: python27, threadsafe: trueapp.yaml에 설정하고 main() 기능을 제거했습니다. 나 자신에 의해 응답을 생성 할 때 잘 작동,하지만 난 방정식에 jinja2을 가지고하려고 할 때, 나는 다음과 같은 예외 얻을 :이 문제를 해결하기 위해 pyramid_jinja2 코드 조각 주위에 엉망으로 시도pyramid + jinja2 및 새로운 GAE 런타임

ERROR 2011-11-07 00:10:34,356 wsgi.py:170] 
Traceback (most recent call last): 
    File "/gae/google/appengine/runtime/wsgi.py", line 168, in Handle 
    [...] 
    File "/myapp/source/myapp-tip/main.py", line 29, in <module> 
    config.include('pyramid_jinja2') 
    File "/myapp/source/myapp-tip/lib/dist/pyramid/config/__init__.py", line 616, in include 
    c(configurator) 
    File "lib/dist/pyramid_jinja2/__init__.py", line 390, in includeme 
    _get_or_build_default_environment(config.registry) 
    File "/lib/dist/pyramid_jinja2/__init__.py", line 217, in _get_or_build_default_environment 
    _setup_environment(registry) 
    File "/lib/dist/pyramid_jinja2/__init__.py", line 253, in _setup_environment 
    package = _caller_package(('pyramid_jinja2', 'jinja2', 'pyramid.config')) 
    File "/lib/dist/pyramid_jinja2/__init__.py", line 136, in caller_package 
    for t in self.inspect.stack(): 
    File "/usr/lib/python2.7/inspect.py", line 1056, in stack 
    return getouterframes(sys._getframe(1), context) 
    File "/usr/lib/python2.7/inspect.py", line 1034, in getouterframes 
    framelist.append((frame,) + getframeinfo(frame, context)) 
    File "/usr/lib/python2.7/inspect.py", line 1009, in getframeinfo 
    lines, lnum = findsource(frame) 
    File "/usr/lib/python2.7/inspect.py", line 534, in findsource 
    module = getmodule(object, file) 
    File "/usr/lib/python2.7/inspect.py", line 506, in getmodule 
    main = sys.modules['__main__'] 
KeyError: '__main__' 

을, 단지 다른 예외로 남아있을 수 있습니다 : 아무도 후드 일을하려고 무엇 피라미드에 도움이 되거 수 있다면

ERROR 2011-11-04 12:06:38,720 wsgi.py:170] 
Traceback (most recent call last): 
    File "/gae/google/appengine/runtime/wsgi.py", line 168, in Handle 
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler()) 
    [...] 
    File "/myapp/source/myapp-tip/main.py", line 29, in <module> 
    config.add_jinja2_search_path("templates") 
    File "/myapp/source/myapp-tip/lib/dist/pyramid/config/util.py", line 28, in wrapper 
    result = wrapped(self, *arg, **kw) 
    File "/lib/dist/pyramid_jinja2/__init__.py", line 311, in add_jinja2_search_path 
    env.loader.searchpath.append(abspath_from_resource_spec(d)) 
    File "/myapp/source/myapp-tip/lib/dist/pyramid/asset.py", line 38, in abspath_from_asset_spec 
    return pkg_resources.resource_filename(pname, filename) 
    File "/myapp/source/myapp-tip/pkg_resources.py", line 840, in resource_filename 
    return get_provider(package_or_requirement).get_resource_filename(
    File "/myapp/source/myapp-tip/pkg_resources.py", line 160, in get_provider 
    __import__(moduleOrReq) 
    File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate 
    return func(self, *args, **kwargs) 
    File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1756, in load_module 
    return self.FindAndLoadModule(submodule, fullname, search_path) 
    File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate 
    return func(self, *args, **kwargs) 
    File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1628, in FindAndLoadModule 
    description) 
    File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate 
    return func(self, *args, **kwargs) 
    File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1571, in LoadModuleRestricted 
    description) 
ImportError: Cannot re-init internal module __main__ 

나는 행복 할 것입니다. 후자의 스택 추적에 따르면 자산을 해결하려고 시도하는 것 같지만 왜 다시로드하려고합니까? __main__? 나는 심지어 내 문제가 피라미드 나 GAE에 의한 것인지 확신하지 못한다.

이 문제에 대한 통찰력을 주셔서 감사합니다.

답변

2

나는 피라미드에 익숙하지 해요,하지만 문제는 정말이 줄 것으로 보인다 : 그 config 일이 무엇이든간에

config.include('pyramid_jinja2') 

은, 일부 동적 수입 마법을하고있는 것으로 보인다.

하지 마십시오.

앱 엔진 환경은 일반 파이썬에서와 같은 방식으로 가져 오기를 처리하지 않습니다. 디버거를 사용하여 그 행을 단계별로 살펴보면 곧 볼 수있는 가져 오기 시스템의 대체 버전에서 실제 파이썬이 수행하는 것의 작은 부분 만 구현할 것입니다.

가능한 경우 일반 가져 오기 문을 사용하십시오. 그렇지 않으면 config.include을 파고 GAE의 제한된 가져 오기 기능으로 멋지게 플레이해야합니다.

+1

교체 가져 오기 시스템이 dev_appserver에 특정 앞에 다음 코드를 추가 init__.py. –

+0

이것이 사실이라면 "import pyramid_jinja2; config.include (pyramid_jinja2)"를 시도해보십시오 (모듈 이름에 문자열을 전달하는 대신 모듈 자체를 전달하십시오). –

+1

불행히도 도움이되지 않았습니다. 똑같은 동작을 얻습니다. – Docent

2

필자는 피라미드 1.3의 AssetResolver을 사용하여 작동하도록 관리했습니다. 첫 번째 시도는 here입니다. 이 경우 리졸버의 유효 기간/범위가 무엇인지 확실하지 않으면 나중에 알아낼 것입니다.

0

는 pyramid_jinja2에서/__ 프로덕션 환경의 제한을 모방, _get_or_build_default_environment()

class VirtualModule(object): 
    def __init__(self,name): 
     import sys 
     sys.modules[name]=self 
    def __getattr__(self,name): 
     return globals()[name] 
VirtualModule("__main__") 

def _get_or_build_default_environment(registry): 

(http://www.inductiveautomation.com/forum/viewtopic.php?f=70&p=36917)

+0

이 문제도 참조하십시오 : https://github.com/Pylons/pyramid_jinja2/issues/63 – cat

관련 문제