2011-11-07 22 views
5

Yeni Python 2.7 çalışma zamanı kullanılarak threadafe modunda ve GAE 1.6.0 pre-release SDK'sında Pyramid'i Jinja2 ile çalıştırmaya çalışıyorum. Uygulamamda here belirtildiği gibi değişiklikler yaptım, yani , threadsafe: true'u app.yaml olarak ayarladım ve main() işlevinden kurtuldum. Kendim yanıtı oluşturmak zaman iyi çalışır, ama denkleme jinja2 getirmek için çalışırken, ben şu istisna olsun: Bu soruna geçici bir çözüm için pyramid_jinja2 koduyla biraz etrafında karışıklık çalıştıpiramit + jinja2 ve yeni GAE çalışma zamanı

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__' 

, yalnızca başka hariç bırakılamayacak: herkes kaputun altında yapmaya çalıştığı şey piramit biraz ışık tutmak eğer

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__ 

mutlu olurdum. İkinci yığın izine bakarak, bir varlığı çözmeyi deniyor gibi görünüyor, ancak neden __main__'u yeniden yüklemeye çalışıyor? Sorunumun piramit veya GAE'den kaynaklandığından bile emin değilim.

Bu sorunla ilgili içgörü için teşekkür ederiz.

cevap

2

Ben piramidin aşina değilim, ama sorun gerçekten bu hat olmak görünüyor: o config şey her neyse

config.include('pyramid_jinja2') 

, bazı dinamik ithalat büyü yapıyor gibi görünüyor.

Bunu yapma.

Uygulama motoru ortamı, normal python'daki gibi içe aktarma işlemlerini gerçekleştirmez. Bu satırdan bir hata ayıklayıcı ile adım atın ve yakında göreceğiniz içe aktarma sisteminin yedek sürümüne gidersiniz, gerçek python'un yalnızca küçük bir bölümünü uygular.

Mümkünse, normal bir içe aktarma deyimi kullanın ... Aksi takdirde, config.include'u kazmanız ve GAE'de kısıtlı içe aktarma özellikleriyle güzel oynamak için onu kullanmanız gerekir.

+1

değiştirme alma sistemi dev_appserver özgü önce aşağıdaki kodu init__.py. –

+0

Eğer bu doğruysa, "pyramid_jinja2; config.include (pyramid_jinja2) 'yi içe aktarmayı deneyebilirsiniz" (modül adı için bir dizgeyi geçirmek yerine, modülün kendisini geçirin; bu eşdeğerdir) –

+1

Ne yazık ki yardımcı olmadı. Tam olarak aynı davranışı elde etmek. – Docent

2

Bunu Pyramid 1.3'ün AssetResolver'u kullanarak çalışmayı başardım. İlk girişim here. Çözümleyicinin kullanım ömrü/kapsamının bu durumda ne olacağından emin değilim, daha sonra anlayacağım.

0

pyramid_jinja2 olarak/__ üretim ortamının kısıtlamalar taklit edilmesi için, _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

Ayrıca bu konuya da bakın: https://github.com/Pylons/pyramid_jinja2/issues/63 – cat

İlgili konular