2011-11-07 13 views
5

Próbuję uruchomić Pyramid z Jinja2 przy użyciu nowego środowiska wykonawczego Python 2.7 w trybie ThreadSafe i SDK 1.6.0 przedpremierowej wersji. Wprowadziłem modyfikacje do mojej aplikacji zgodnie z opisem here, tj. Ustawiłem runtime: python27, threadsafe: true w app.yaml i pozbyłem się funkcji main(). Kiedy generuje odpowiedź sama to działa dobrze, ale gdy próbuję doprowadzić jinja2 do równania, pojawia się następujący wyjątek:Piramida + jinja2 i nowe środowisko wykonawcze 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__' 

próbowałem poeksperymentować trochę z kodem pyramid_jinja2 aby obejść ten problem, tylko być pozostawione z innym wyjątkiem:

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__ 

byłbym szczęśliwy, jeśli ktoś mógłby rzucić trochę światła na to, co piramida próbuje zrobić pod maską. Sądząc po ostatniej ścieżce stosu, wydaje się, że próbuje rozwiązać zasób, ale dlaczego próbuje przeładować __main__? Nie jestem nawet pewien, czy mój problem wynika z piramidy czy GAE.

Dziękujemy za wszelkie informacje na ten temat.

Odpowiedz

2

nie jestem zaznajomiony z piramidy, ale problem naprawdę wydaje się być z tej linii:

config.include('pyramid_jinja2') 

Cokolwiek to config rzeczą jest to, że wydaje się jakiejś dynamiki importu magii.

Nie rób tego.

Środowisko aparatu aplikacji nie obsługuje importowania w sposób zgodny z normalnym pythonem. Przejdź przez tę linię z debuggerem, a skończysz w zastępczej wersji systemu importu, który wkrótce zobaczysz, implementuje tylko niewielką część tego, co robi prawdziwy python.

Jeśli to możliwe, użyj zwykłej instrukcji importu ... W przeciwnym razie musisz zagłębić się w config.include i sprawić, by gra była przyjemna z ograniczonymi funkcjami importowania na GAE.

+1

System import wymiana jest specyficzny dla dev_appserver, aby naśladować ograniczeń środowiska produkcyjnego. –

+0

Jeśli to prawda, możesz spróbować "importować pyramid_jinja2; config.include (pyramid_jinja2)" (zamiast podawać ciąg znaków dla nazwy modułu, przekazywać moduł sam w sobie, jest to odpowiednik) –

+1

Niestety to nie pomogło. Uzyskanie dokładnie takiego samego zachowania. – Docent

2

Udało mi się sprawić, by działał on przy użyciu piramidy 1.3 AssetResolver. Pierwsza próba to here. Po prostu nie jestem pewien, jaki powinien być w tym przypadku czas życia/zasięg resolwera.

0

W pyramid_jinja2/__ init__.py dodaj następujący kod przed _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

Zobacz także ten numer: https://github.com/Pylons/pyramid_jinja2/issues/63 – cat

Powiązane problemy