当您作为独立运行它时会发生这种ImportError
情况,因为它不会包含作为应用程序运行时包含的任何“魔法”。例如,如果您查看dev_appserver.py
(只是用于运行开发服务器的基本功能),您会看到以下功能:
def fix_sys_path(extra_extra_paths=()):
"""Fix the sys.path to include our extra paths."""
extra_paths = EXTRA_PATHS[:]
extra_paths.extend(extra_extra_paths)
sys.path = extra_paths + sys.path
在这里您可以看到sys.path
正在修改以包含一些“额外”路径,如果我们查看其中一个,您会看到webapp2
(以及 SDK 中提供的其他库):
EXTRA_PATHS = [
# ...other similar setups...
os.path.join(DIR_PATH, 'lib', 'webapp2'),
# ...other similar setups...
]
你可以看到 GAE 在幕后执行了一些额外的步骤,让你说import webapp2
没有问题。因此,当您尝试自行运行它时,您将收到该错误,因为您的系统只是检查标准路径webapp2
(您可能尚未安装)。
这根本不能真正回答你的问题:)至于这一点,我相信肯定有更优雅/更合适的方法来处理这个问题,但你可以尝试的一件事是将你的导入包装在一个try/except
块中并且on ImportError
,检查您是否直接运行该模块。如果是这样,请调用模块文档字符串并退出。请注意,这只是一个示例 - 如果您要实际使用它,您可能希望使其更加精致:
"""Module information."""
import sys
try:
import webapp2
except ImportError:
if __name__ == '__main__':
print __doc__
else:
print 'Webapp2 not found'
sys.exit(1)
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
Module information
如果您直接运行它,这将打印出来。