pip installで導入したパッケージのバイナリファイルのパスを知る方法

こんにちは、エンジニアの @akase244 です。

「AWS Lambdaを触ってみたい」と急に思いたち、AWSのドキュメントを読んでいたのですが、Lambdaを触るための前準備として以下の3つが説明されており、その中の「SAM CLI のインストール」がうまくいかずハマってしまったので、その際のメモを残しておこうと思います。

Lambdaを触るための前準備

冒頭で大まかな流れを書きましたが、もう少し詳しく書くとこんな感じになります。

  • AWS アカウントのセットアップ
    • AWSアカウントを作成する。
    • IAMユーザーを作成する。
  • AWS CLI のセットアップ
    • AWS CLIをインストールする。
    • 作成済みのIAMユーザーの情報を元にAWS CLIの設定を行う。
  • SAM CLI のインストール
    • SAM CLIをインストールする。

SAM CLIのインストール方法

今回ハマってしまった「SAM CLIのインストール」ですが、AWSのドキュメント(Installing the AWS SAM CLI)によると、以下の3つが揃っていることが条件となっています。

  • Docker
  • AWS CLI
  • Python 2.7 または Python 3.6 で pipコマンドが実行できる環境

これらの条件が揃った上で

$ pip install --user --upgrade aws-sam-cli

を実行するとSAM CLIのインストールが完了します。

なぜかコマンドが見つからない

インストール自体はうまくいったように見えたのですが、samコマンドを実行してみると「コマンドが見つからない」というエラーが表示されました。

$ sam --version
-bash: sam: command not found

pip installで導入済みのパッケージの一覧から「aws-sam-cli」を検索してみると、やはりインストールはうまくいっているように見えるので恐らくコマンドサーチパスが通っていないのではないかと予想しました。

$ pip list |grep aws-sam-cli
aws-sam-cli                   0.10.0 

バイナリファイルのパスを確認

色々と調べていると「pip showで確認できる」とのことで実行してみると、イマイチ欲しい情報ではありませんでした。

$ pip show aws-sam-cli
Name: aws-sam-cli
Version: 0.10.0
Summary: AWS SAM CLI is a CLI tool for local development and testing of Serverless applications
Home-page: https://github.com/awslabs/aws-sam-cli
Author: Amazon Web Services
Author-email: aws-sam-developers@amazon.com
License: Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/
Location: /Users/akase244/Library/Python/2.7/lib/python/site-packages
Requires: chevron, aws-lambda-builders, boto3, Flask, docker, requests, six, python-dateutil, pathlib2, click, dateparser, aws-sam-translator, cookiecutter, serverlessrepo, enum34, PyYAML
Required-by: 

今回欲しい情報は「rpm -ql パッケージ名」や「repoquery --installed -l パッケージ名」の実行結果のようにインストール済みパッケージのファイル一覧です。

さて答えになりますが、実はおしいところまで迫っていました。
「pip show」に「-f」オプションをつけることで「pip show」の実行結果に「Files:」という情報が付加されて表示されます。

$ pip show -f aws-sam-cli 
Name: aws-sam-cli
Version: 0.10.0
Summary: AWS SAM CLI is a CLI tool for local development and testing of Serverless applications
Home-page: https://github.com/awslabs/aws-sam-cli
Author: Amazon Web Services
Author-email: aws-sam-developers@amazon.com
License: Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/
Location: /Users/akase244/Library/Python/2.7/lib/python/site-packages
Requires: chevron, aws-lambda-builders, serverlessrepo, boto3, Flask, docker, requests, six, python-dateutil, pathlib2, click, dateparser, aws-sam-translator, cookiecutter, enum34, PyYAML
Required-by: 
Files:
  ../../../bin/sam
  aws_sam_cli-0.10.0.dist-info/INSTALLER
  aws_sam_cli-0.10.0.dist-info/METADATA
  aws_sam_cli-0.10.0.dist-info/RECORD
・
・
省略
・
・
  tests/unit/local/services/test_base_local_service.py
  tests/unit/local/services/test_base_local_service.pyc
  tests/unit/test_yamlhelper.py
  tests/unit/test_yamlhelper.pyc

なお、確認したかったのはバイナリファイルへのパスですので、このようにgrepするとよいでしょう。

$ pip show -f aws-sam-cli |grep '/bin'
  ../../../bin/sam

コマンドサーチパスの設定

「pip show -f 」の結果をよく見るとこのように出力されています。

Location: /Users/akase244/Library/Python/2.7/lib/python/site-packages
・
・
省略
・
・
Files:
  ../../../bin/sam

つまり、「/Users/akase244/Library/Python/2.7/bin」に対してコマンドサーチパスを通すことでうまくいきそうだということがわかります。

なので「.bash_profile」に以下の行を追加してみます。

export PATH=$PATH:$HOME/Library/Python/2.7/bin

.bash_profileを再読込すると今度はうまくいきました!

$ source .bash_profile 
$ sam --version
SAM CLI, version 0.10.0

おまけ1

pipコマンドを使い慣れてる方にとっては当たり前なのかもしれませんが、あまり使ったことがなかったので思いがけずハマってしまいました。
まぁ、そんな人のためにインストール時にPATHについて丁寧なメッセージが表示されてるので、ちゃんと読みましょうってことなんですけどね。。。

$ pip install --user --upgrade aws-sam-cli
Collecting aws-sam-cli
  Using cached https://files.pythonhosted.org/packages/30/bf/e2302637eb5766342b405383d8b25c5db6ccb66ca4ce8030ef63b2a33dab/aws_sam_cli-0.10.0-py2-none-any.whl
Requirement already satisfied, skipping upgrade: chevron~=0.12 in ./Library/Python/2.7/lib/python/site-packages (from aws-sam-cli) (0.13.1)
・
・
省略
・
・
Installing collected packages: aws-sam-cli
  The script sam is installed in '/Users/akase244/Library/Python/2.7/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed aws-sam-cli-0.10.0

おまけ2

samコマンドがうまく実行できなかった際に、pip installでの導入に失敗しているのではないかと思い再インストールしてみようとしたのですが、実はpip uninstallでもバイナリファイルのパスを知ることができます。

$ pip uninstall aws-sam-cli
Uninstalling aws-sam-cli-0.10.0:
  Would remove:
    /Users/akase244/Library/Python/2.7/bin/sam
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/aws_sam_cli-0.10.0.dist-info/*
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/samcli/*
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/functional/*
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/integration/*
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/*
  Would not remove (might be manually added):
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/conftest.py
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_application_metadata.py
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_application_policy.py
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_parser.py
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_permission_helper.py
    /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_publish.py
Proceed (y/n)?