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で構築し直しました。
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'