これを説明するには少し時間がかかるかもしれませんが、ご容赦ください。
私は、Google アナリティクス データを取り込む必要がある仕事のプロジェクトに取り組んでいます。私はもともとこのリンクに従ってこれを行ったので、API クライアントpip install --upgrade google-api-python-client
をインストールして のように設定した後、ステートメントclient_secrets.json
を実行するために gflags をインストールする必要がありましたrun()
。(つまりcredentials = run(FLOW, storage)
)
今、gflagsをインストールするか、より適切に使用するためのエラーメッセージが表示されましたrun_flow()
(正確なエラーメッセージはこれでした):
NotImplementedError: tools.run() を使用するには、gflags ライブラリをインストールする必要があります。gflags をインストールするか、できれば tools.run_flow() を使用するように切り替えてください。
私はもともと gflags を使用していました (数か月前) が、フレームワーク (ピラミッド) と互換性がなかったため、問題が何であるかがわかるまで削除しました。また、gflags から gflags に切り替えることが望ましい理由run_flow()
は、gflags が非推奨になったため、以前のように使用したくないためです。私が今やろうとしているのは、使用に切り替えることですrun_flow()
これに関する問題run_flow()
は、コマンド ライン引数が送信されることを想定しており、これはコマンド ライン アプリケーションではありません。役立つドキュメントをいくつか見つけましたが、関数のフラグの作成に行き詰まっていrun_flow()
ます。
コードを表示する前に、もう 1 つ説明します。
run_flow()
3 つの引数を取ります(ドキュメントはこちら)。これはフローとストレージを使用するのと同じように使用run()
しますが、フラグ オブジェクトも使用します。gflags ライブラリは、実行メソッドArgumentParser
で使用される flags オブジェクトを構築しました。oauth2client
argumentParser
オブジェクトの構築に役立つ他のいくつかのリンク:
- リンク 1: https://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.tools-module.html
- リンク 2: https://developers.google.com/compute/docs/api/python-guide
2番目のリンクは、それがどのように実行されるかを確認するのに非常に役立ちsys.argv
ます.仮想環境を実行します)。しかし、それは何か他のものを期待しているため、エラーがスローされます。これが私が立ち往生している場所です。pserve
.ini
- 送信するために構築する必要があるフラグ オブジェクトがわかりません
run_flow()
- ステートメントが正しい情報を取得するために渡す必要がある argv 引数がわかり
flags = parser.parse_args(argv[1:])
ません (正しい情報がどうあるべきかわかりません)
コード:
CLIENT_SECRETS = client_file.uri
MISSING_CLIENT_SECRETS_MESSAGE = '%s is missing' % CLIENT_SECRETS
FLOW = flow_from_clientsecrets(
CLIENT_SECRETS,
scope='https://www.googleapis.com/auth/analytics.readonly',
message=MISSING_CLIENT_SECRETS_MESSAGE
)
TOKEN_FILE_NAME = 'analytics.dat'
def prepare_credentials(self, argv):
storage = Storage(self.TOKEN_FILE_NAME)
credentials = storage.get()
if credentials is None or credentials.invalid:
parser = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter,
parents=[tools.argparser])
flags = parser.parse_args(argv[1:]) # i could also do just argv, both error
credentials = run_flow(self.FLOW, storage, flags)
return credentials
def initialize_service(self, argv):
http = httplib2.Http()
credentials = self.prepare_credentials(self, argv)
http = credentials.authorize(http)
return build('analytics', 'v3', http=http)
を呼び出すメイン関数をsys.argv
呼び出します。initialize_service
def main(self, argv):
service = self.initialize_service(self, argv)
try:
#do a query and stuff here
私のアプリケーションはコマンド ライン アプリケーションではなく、完全に統合されたサービスであるため、これが機能しないことはわかっていましたが、試してみる価値があると考えました。flags オブジェクトを正しく構築する方法について何か考えはありますか?