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.
System import wymiana jest specyficzny dla dev_appserver, aby naśladować ograniczeń środowiska produkcyjnego. –
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) –
Niestety to nie pomogło. Uzyskanie dokładnie takiego samego zachowania. – Docent