0

gaeでルーターモジュールのdocstringを作成したいと思います。また、それがモジュールの最初のものでなければならないことも知っています(ファイルエンコーディングタイプの後)。

重要なのは、このモジュールを単独で実行すると、インポートエラー(No module named webapp2)しか発生しないということです。私が欲しかったのは、ファイルだけを実行しているときにdocstringを出力することですが、このインポートエラーでは許可されません。これを行う方法はありますか?

私は試した:

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は、いくつかの「追加」パスを含むように変更されていることがわかります。そのうちの1つを見ると、webapp2(およびSDKで提供される追加のライブラリ)が表示されます。

EXTRA_PATHS = [
  # ...other similar setups...
  os.path.join(DIR_PATH, 'lib', 'webapp2'),
  # ...other similar setups...
]

GAEが舞台裏でいくつかの追加手順を実行して、import webapp2問題なく発言できるようになっていることがわかります。したがって、それを単独で実行しようとすると、システムがwebapp2(おそらくインストールされていない)の標準パスをチェックしているだけなので、そのエラーが発生します。

そして、それはあなたの質問にまったく答えません:)それに関しては、これを処理するためのよりエレガントで適切な方法があると確信していますが、あなたが試すことができる1つのことはあなたのインポートをtry/exceptブロックで包むことですでImportError、モジュールを直接実行しているかどうかを確認します。その場合は、モジュールdocstringを呼び出して終了します。これは単なる例であることに注意してください。実際に使用する場合は、これをより洗練されたものにする必要があります。

"""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 に答える