Как сделать строку документации для gae для модуля роутера python?

Я хочу сделать документацию для моего модуля маршрутизатора в 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)

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 блок и на 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 если вы запустите его напрямую.

Другие вопросы по тегам