2012-02-20 12 views
9
struktura

Mój katalog w app silnika jest tak:No moduł nazwany Przecena App Engine

project 
    app.yaml 
    main.py 
    lib 
     markdown 
     markdown_files 

Markdown jest przywożony w main.py przez from lib.markdown import markdown. W tym momencie serwer dev zaczyna podawać mi następujący ślad stosu. Zastanawiam się, co tu jest nie tak! Mam plik init .py w bibliotece lib.

Traceback (most recent call last): 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2769, in _HandleRequest 
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2654, in _Dispatch 
    base_env_dict=env_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 683, in Dispatch 
    base_env_dict=base_env_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1718, in Dispatch 
    self._module_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1622, in ExecuteCGI 
    reset_modules = exec_script(config, handler_path, cgi_path, hook) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1310, in ExecuteOrImportScript 
    exec module_code in script_module.__dict__ 
    File "/Users/nomadali/jeeqs/git/src/jeeqs.py", line 26, in <module> 
    from lib.markdown import markdown 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1845, in load_module 
    return self.FindAndLoadModule(submodule, fullname, search_path) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1717, in FindAndLoadModule 
    description) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1660, in LoadModuleRestricted 
    description) 
    File "/Users/nomadali/jeeqs/git/src/lib/markdown/__init__.py", line 161, in <module> 
    import preprocessors 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1845, in load_module 
    return self.FindAndLoadModule(submodule, fullname, search_path) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1717, in FindAndLoadModule 
    description) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1660, in LoadModuleRestricted 
    description) 
    File "/Users/nomadali/jeeqs/git/src/markdown/preprocessors.py", line 11, in <module> 
ImportError: No module named markdown 
INFO  2012-02-20 19:53:02,506 dev_appserver.py:2884] "GET /favicon.ico HTTP/1.0" 500 - 

Update1

Wierzę, że to pytanie jest dupe od Import Python module with PyImport_ImportModuleEx for a gedit plugin

odpowiedź:

Jeśli chcesz korzystać z przecen bez modyfikowania go potem idziesz trzeba umieścić go gdzieś, gdzie biblioteka Pythona tego oczekuje, na przykład w pakietach site /. W przeciwnym razie będziesz musiał go zmodyfikować, aby używał względnego importu zamiast bezwzględnego importu.

Aktualizacja 2 I rozwiązany ten problem modyfikując mój sys.path w APP silnika:

sys.path.append (os.path.join (os.path.dirname (plik), 'lib'))

Dzięki Murat o pomoc,

+0

Jeśli nie masz dużo modułów stron trzecich, łatwiej byłoby po prostu usunąć katalog lib i umieścić katalog wartościowania w katalogu głównym projektu. Wtedy nie musisz w ogóle edytować swojej ścieżki. –

+0

Mam naprawdę dużo bibliotek. – Ali

+0

Powinieneś dodać swoją odpowiedź jako odpowiedź na pytanie i oznaczyć odpowiedź jako właściwą odpowiedź. Dzięki. – amirouche

Odpowiedz

0

Wierzę, że to pytanie jest dupe modułu importu Pythona z PyImport_ImportModuleEx dla wtyczki gedit

Odpowiedź:

Jeśli chcesz korzystać z przecen bez modyfikowania go potem masz zamiar umieścić to gdzieś, gdzie biblioteka Pythona tego oczekuje, na przykład w pakietach site /. W przeciwnym razie będziesz musiał go zmodyfikować, aby używał względnego importu zamiast bezwzględnego importu.

Aktualizacja 2 I rozwiązany ten problem modyfikując mój sys.path w app silnika:

sys.path.append (os.path.join (Wywołanie os.path.dirname (plików), 'lib'))

Dzięki Murat o pomoc,

-1

co chcesz to dla lib być w PYTHONPATH, ścieżki gdzie Python wygląda rzeczy, aby spróbować zaimportować. Jak już odkryłeś, jednym ze sposobów na to jest dodanie lib do sys.path.

Tworzenie pliku .py nie jest tym, czego potrzebujesz, ponieważ powoduje to, że lib jest pakietem zawierającym przecenę. W tym momencie powinieneś być w stanie wykonać chociaż nie jest to zalecany sposób.

0

potrzebuje plik na miano __init__.py na to pracować.

Dodanie katalogu lib do pythonpath również działa.

Jeśli chcesz korzystać z przecen bez modyfikowania go potem masz zamiar umieścić go gdzieś, gdzie biblioteki Python oczekuje go, tak jak w site-packages/

Jest to nieprawidłowe, Mechanizm aplikacji ma własny mechanizm importu i tylko te pakiety, które są jawnie białe, mogą być importowane za pomocą tej metody.