0

我想在 gae 中为我的路由器模块制作一个文档字符串。我也知道它必须是模块中的第一件事(在文件编码类型之后)。

问题是,如果你单独运行这个模块,你只会得到一个导入错误(No module named webapp2)。我想要的是在只运行文件时打印文档字符串,但是这个导入错误不允许我这样做。有没有办法做到这一点?

我试过了:

if __name__ == "__main__":
    print help(self)

和其他组合,但没有成功。

[编辑]

没有具体代码。可能是appengine的例子:

# coding: utf-8
""" docstring """

import webapp2

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)
4

1 回答 1

1

当您作为独立运行它时会发生这种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如果您直接运行它,这将打印出来。

于 2013-01-05T11:15:07.310 回答