aliyun-log-cliのインストール方法

Alibaba CloudのLog SserviceのCLIツールであるaliyun-log-cliというものがあります。

User Guide — Aliyun Log Service CLI 0.1.13 documentation

しかしaliyun-log-cliを使おうと公式ドキュメントのインストールガイドに従ったところ以下のエラーが出ました。

$ ./aliyunlog
Traceback (most recent call last):
  File "./aliyunlog", line 9, in <module>
    load_entry_point('aliyun-log-cli', 'console_scripts', 'aliyunlog')()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pkg_resources/__init__.py", line 565, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2290, in load
    self.require(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2307, in require
    items = working_set.resolve(reqs, env, installer)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pkg_resources/__init__.py", line 853, in resolve
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'jmespath' distribution was not found and is required by the application

メッセージに出ているjmespathは既にインストールされていました。

$ pip3 install -U jmespath
Requirement already up-to-date: jmespath in /usr/local/lib/python3.6/site-packages (0.9.3)

もしやと思ってaliyun-log-cliの場所を見てみました。

$ pip3 show aliyun-log-cli
Name: aliyun-log-cli
Version: 0.1.13
Summary: Aliyun log service CLI
Home-page: https://github.com/aliyun/aliyun-log-cli
Author: Aliyun
Author-email: UNKNOWN
License: UNKNOWN
Location: /Users/asmsuechan/Library/Python/3.6/lib/python/site-packages
Requires: aliyun-log-python-sdk, jmespath, docopt
Required-by:

これが原因っぽいですね。

python3のパッケージの参照先が/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packagesになっているのに対し、pip3はパッケージを/Users/asmsuechan/Library/Python/3.6/lib/python/site-packagesにインストールしています。

というわけでpython3の参照先を変更したかったのですが、brewでインストールしたPythonがいたりサーチパスがappendされなかったりと自分の環境がまずい上にAttributeError: module 'enum' has no attribute 'IntFlag'など他のエラーも出てどうにもうまくいかなかったので、Pythonの環境をanacondaで構築し直しました

www.anaconda.com

anacondaのpython3でやってみる

まずはanacondaのpipでaliyun-log-cliをインストールします。

$ ~/anaconda3/bin/pip install -U aliyun-log-cli
Collecting aliyun-log-cli
(中略)
Installing collected packages: jmespath, protobuf, enum34, aliyun-log-python-sdk, docopt, aliyun-log-cli
Successfully installed aliyun-log-cli-0.1.13 aliyun-log-python-sdk-0.6.30.4 docopt-0.6.2 enum34-1.1.6 jmespath-0.9.3 protobuf-3.6.0

パッケージは/Users/asmsuechan/anaconda3/lib/python3.6/site-packagesに保存されます。

ではドキュメントを参考にaliyunlog.pyを以下のように作成します。(ただ冒頭のShebangを消して拡張子を.pyにしただけのものです)

import re
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(
        load_entry_point('aliyun-log-cli', 'console_scripts', 'aliyunlog')()
    )

さてこれをanacondaのpython3を使って実行します。

$ ~/anaconda3/bin/python3 aliyunlog.py

Usage:

1. aliyunlog log <subcommand> [parameters | global options]
2. aliyunlog configure <access_id> <access-key> <endpoint> [<client-name>]
3. aliyunlog configure [--format-output=json] [--default-client=<client_name>] [--decode-output=utf8,latin1]
4. aliyunlog [--help | --version]


Examples:

1. aliyunlog configure AKID123 AKKEY123 cn-hangzhou.log.aliyuncs.com
2. aliyunlog configure --format-output=json --default-client=beijing
3. aliyunlog log create_project --project_name="test"
...()

できました。

以上、Alibaba Cloudほとんど関係ないPythonの問題でした。

まとめ

なんの根本解決もしていませんが、何か起きる度に手でpipとpythonの整合性を合わせ続けるのは限界なのでanacondaを使いました。

ちなみにこういう時こそDockerが便利だと思ってやってみましたがDocker力(Python力かも)が足らずに失敗しています。。。悲しい。。。

$ alias python='docker run -it -v `pwd`/:/src -w /src -e PYTHONPATH="/src/.pip" python python'
$ alias 'pip-install'='docker run -it -v `pwd`/:/src -w /src python pip install --target=/src/.pip'
$ pip-install aliyun-log-cli
$ python aliyunlog.py
Traceback (most recent call last):
  File "aliyunlog.py", line 1, in <module>
    import re
  File "/usr/local/lib/python3.6/re.py", line 142, in <module>
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'