ホーム DoRuby `sls invoke local` すると`Error: spawn python3.6 ENOENT`と言われた
`sls invoke local` すると`Error: spawn python3.6 ENOENT`と言われた
 

`sls invoke local` すると`Error: spawn python3.6 ENOENT`と言われた

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Serverless Framework 使ってみてますが便利ですね。Serverless Frameworkの「売り」のひとつである「ローカル環境での Lambda関数の実行」がなぜかエラーになっていたので少し突っ込んで調べてみました。

環境

以下のような環境で確認しました。

  • macOS 10.10.5 (Yosemite)
  • python 3.6.1 (pyenvでインストール)
  • Serverless Framework 1.14.0
  • node 4.4.5

原因

serverless コマンドのソースコードを覗いてみました。
どうやら、lib/plugins/aws/invokeLocal/index.js の ここ や ここ で process.env の 環境変数 PATH を書き換えているが、pyenvでインストールしている python3.6 にPATHが通っていないため発生している模様。

対処

最初、Serverless Framework側にプルリク投げる必要があるかと思ったが、いろいろ見たら、pyenv はいらないという結論になったのでpyenvをアンインストール。

あらためて pytho3.6 をインストール

$ brew install python3

boto3 も入れ直す

$ pip3 install boto3

以上で正常に動作するようになった。

さいごに

最近、rbenv で Ruby 環境を構築するのに慣れてて、同じ感覚で Python 環境も構築してましたが、ちょっと勝手が違ったようです。

今回は、Python 2.x 系と 3.x 系を共存させたいという要件はなかったため、Python 3.6 をそのままインストールしてしまいましたが、共存させる場合は前述の Qiita の記事にあるように virtualenv(venv) 使うのが良さそうです。

2017/6/4 追記

この記事では pyenv をやめて直接 Python3.6 をインストールしたという結果になりましたが、後日調査して pyenv でも Python3系でのローカル実行できる環境が作成できることがわかりました。
以下の記事をご覧ください。

記事を共有

最近人気な記事