2011-11-07 12 views
5

Sto cercando di eseguire Pyramid con Jinja2 utilizzando il nuovo runtime di Python 2.7 in modalità threadsafe e l'SDK di pre-release di GAE 1.6.0. Ho apportato modifiche alla mia app come indicato nel here, ad esempio, ho impostato runtime: python27, threadsafe: true in app.yaml e eliminato la funzione main(). Quando ho generare la risposta da solo funziona bene, ma quando provo a portare Jinja2 nell'equazione, ottengo la seguente eccezione:pyramid + jinja2 e nuovo runtime 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__' 

ho provato a pasticciare un po 'con il codice pyramid_jinja2 per ovviare a questo problema, solo per essere lasciato con un'altra eccezione:

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__ 

sarei felice se qualcuno potesse far luce su ciò che piramide sta cercando di fare sotto il cofano. A giudicare dall'ultima traccia dello stack sembra che stia cercando di risolvere un asset, ma perché sta cercando di ricaricare __main__? Non sono nemmeno sicuro che il mio problema sia causato dalla piramide o dal GAE.

Grazie per qualsiasi chiarimento su questo problema.

risposta

2

Non ho familiarità con la piramide, ma il problema sembra davvero di stare con questa linea:

config.include('pyramid_jinja2') 

Qualunque cosa che config cosa è, esso sembra fare qualche magia dinamica di importazione.

Non farlo.

L'ambiente del motore dell'app non gestisce le importazioni come nel normale python. Attraversa quella linea con un debugger e finirai nella versione sostitutiva del sistema di importazione, che vedrai presto, implementa solo una piccola parte di ciò che fa python reale.

Se possibile, basta utilizzare una normale istruzione di importazione ... In caso contrario, sarà necessario scavare nello config.include e farlo funzionare con le funzionalità di importazione con restrizioni su GAE.

+1

Il sistema di importazione di sostituzione è specifico per il dev_appserver, di imitare le limitazioni dell'ambiente di produzione. –

+0

Se ciò è vero, puoi provare "import pyramid_jinja2; config.include (pyramid_jinja2)" (invece di passare una stringa per il nome del modulo, passare il modulo stesso, è equivalente) –

+1

Sfortunatamente non è stato d'aiuto. Ottenere esattamente lo stesso comportamento. – Docent

2

Sono riuscito a farlo funzionare utilizzando Pyramid 1.3's AssetResolver. Il primo tentativo è here. Solo non sono sicuro di quale dovrebbe essere la durata/portata del resolver in questo caso, lo scoprirò più tardi.

0

In pyramid_jinja2/__ init__.py aggiungere il seguente codice prima _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

Vedi anche questo numero: https://github.com/Pylons/pyramid_jinja2/issues/63 – cat

Problemi correlati