Ошибка новичка Python в отношении импорта - PullRequest
4 голосов
/ 16 марта 2010

Я новичок в Python и начинаю с использования веб-фреймворка Bottle в Google App Engine. Я возился с супер маленьким, супер легким образцом Hello World и уже столкнулся с проблемами. Хех. Я наконец получил код для работы с этим ...

import bottle
from bottle import route
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

У меня такой вопрос, я думал, что могу просто пойти "импортировать бутылку" без второй строки. Но если я возьму вторую строку, я получу NameError. Или, если я делаю «из импорта бутылки», я все равно получаю сообщение об ошибке. бутылка - это всего лишь один файл с именем 'bottle.py' в корневом каталоге моего сайта. Так что ни одна из этих работ ....

import bottle
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

Или

from bottle import *
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

Я получаю сообщение об ошибке ...

Traceback (последний вызов был последним):
файл "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", строка 3180, в _HandleRequest Файл self._Dispatch (диспетчер, self.rfile, outfile, env_dict) "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", строка 3123, в _Dispatch base_env_dict = env_dict) Файл "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", линия 515, в диспетчерской Файл base_env_dict = base_env_dict) "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", линия 2382, в рассылку self._module_dict) Файл "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", строка 2292, в ExecuteCGI reset_modules = exec_script (handler_path, cgi_path, крючок) Файл "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", строка 2188, в ExecuteOrImportScript exec module_code в script_module. dict Файл "/Users/tyler/Dropbox/sites/dietgrid/code2.py", строка 4, в @route ('/') NameError: имя 'route' не определено

Так я ошибаюсь, полагая, что он должен работать другими способами или нет?

Ответы [ 5 ]

8 голосов
/ 16 марта 2010

В вашем коде есть два разных способа вызова методов из пакета bottle.

route('/hello')

и

bottle.default_app()

Для первого вызова требуется from bottle import route или from bottle import *, а для второго требуется import bottle.

from foo import bar позволяет вам использовать метод или параметр bar в вашем коде без указания пакета при каждом вызове.

5 голосов
/ 16 марта 2010

Относительно почему

from bottle import *

не работает: при таком импорте импортируются только имена, указанные в списке _____ всех бутылок. Таким образом, если маршрута нет, вы должны указать импорт явно:

from bottle import route
3 голосов
/ 16 марта 2010

route является частью модуля bottle.

Следующее должно решить проблему

import bottle
...

@bottle.route('/hello')
def hello():
    return "Hello World!"

...
2 голосов
/ 16 марта 2010

Вы можете либо просто импортировать бутылку в свое пространство имен, поэтому каждый раз, когда вы хотите что-то использовать оттуда, в качестве префикса вы используете bottle..

import bottle
from google.appengine.ext.webapp import util 

@bottle.route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

Другой способ - импортировать части бутылки, которые вы собираетесь использовать, в ваше пространство имен.

from bottle import route, default_app
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(default_app())
0 голосов
/ 26 февраля 2011

Я тоже научился использовать бутылку с GAE из-за ее очень маленького размера. Что вы можете сделать, так это сохранить бутылку непосредственно с вашими основными файлами, что позволит вам использовать «бутылку импорта» или поместить в папку (чтобы отделить ее от других файлов, дать аккуратную структуру) и добавить пустую __init__.py файл в эту папку. Затем вы можете импортировать его как import bottle from <foldername> и так далее. Я написал небольшое руководство по , как использовать Bottle с GAE .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...