conda skeletonで、KeyError:'extras_require'が起きたときの対処法
自分のMacbook Air(2020, M1)では、conda skeleton pypi <package-name>
コマンドが失敗した。
参考に、自分の環境におけるエラーメッセージを示す。
Traceback (most recent call last):
File "/opt/conda/bin/conda-skeleton", line 11, in <module>
sys.exit(main())
File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 64, in main
return execute(sys.argv[1:])
File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 59, in execute
api.skeletonize(args.packages, args.repo, output_dir=args.output_dir, recursive=args.recursive,
File "/opt/conda/lib/python3.9/site-packages/conda_build/api.py", line 276, in skeletonize
skeleton_return = module.skeletonize(packages, output_dir=output_dir, version=version,
File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 315, in skeletonize
get_package_metadata(package, d, data, output_dir, python_version,
File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 752, in get_package_metadata
requires = get_requirements(package, pkginfo, all_extras=all_extras)
File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 1115, in get_requirements
for extra in pkginfo['extras_require']:
KeyError: 'extras_require'
最終的にこれを克服してパッケージをリリースできたので、対処法をメモする。
最初に
これは、Python: 3.9, conda-build: v3.21.8で確認されているものである。
以下のようにissueが立てられていることもあり、今後のアップデートで改善される余地があることは理解しておくべきである。自分の環境では、Python 3.7, 3.8においても同様の事象でエラーとなった。
https://github.com/conda/conda-build/issues/4354
エラー解決までの経緯
さきほど示したissueにあったが、Python 3.6でbuildすることで実行可能になるとの報告があった。
したがって、以下のコマンドでPythonのバージョンを3.6に指定した上で実行した。
conda skeleton pypi --python-version 3.6 <package-name>
するとエラーメッセージ内容が以下のように変化した。
Traceback (most recent call last):
File "/opt/conda/bin/conda-skeleton", line 11, in <module>
sys.exit(main())
File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 64, in main
return execute(sys.argv[1:])
File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 59, in execute
api.skeletonize(args.packages, args.repo, output_dir=args.output_dir, recursive=args.recursive,
File "/opt/conda/lib/python3.9/site-packages/conda_build/api.py", line 276, in skeletonize
skeleton_return = module.skeletonize(packages, output_dir=output_dir, version=version,
File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 315, in skeletonize
get_package_metadata(package, d, data, output_dir, python_version,
File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 741, in get_package_metadata
pkginfo = get_pkginfo(package,
File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 1192, in get_pkginfo
run_setuppy(src_dir, tempdir, python_version, extra_specs=extra_specs, config=config,
File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 1233, in run_setuppy
create_env(config.host_prefix, specs_or_actions=specs, env='host',
File "/opt/conda/lib/python3.9/site-packages/conda_build/environ.py", line 882, in create_env
actions = get_install_actions(prefix, tuple(specs), env,
File "/opt/conda/lib/python3.9/site-packages/conda_build/environ.py", line 801, in get_install_actions
raise DependencyNeedsBuildingError(exc, subdir=subdir)
conda_build.exceptions.DependencyNeedsBuildingError: Unsatisfiable dependencies for platform linux-aarch64: {'python=3.6'}
要するにPython 3.6はARMチップに対応してないよ、ということ。
解決策
これらを踏まえると以下の条件が揃えばconda skeletonできそうだということがわかる。
- Python 3.6を使用する
- AMD環境で実行する
これをARMチップ搭載のM1 Macbook上で実行するために、DockerによりAMDアーキテクチャのイメージを使用することにした。もちろん速度は劣るが、もう一台パソコンを購入するよりはマシだと考えている。
追記(2022年6月16日)
これから紹介するようなDocker環境を構築しなくても、もっと簡単にmeta.yamlを生成できる方法が見つかったので追記する。
それは、grayskullというパッケージを利用する方法である。
grayskullはconda-forgeチャンネルから簡単にダウンロードできる。
conda install -c conda-forge grayskull
あとは、以下の通りgrayskullコマンドを実行すれば自動的にmeta.yamlファイルを生成してくれる。
grayskull pypi <package-name>
dockerで環境構築したり、Pythonで取得URLを変えたりしたあの努力はなんだったんだ…
— 追記終わり(2022年6月16日) —
Docker環境の構築
使用したimage: continuumio/miniconda3: 4.11.0のAMD版
実際に使用した環境(Dockerfile等)は以下で公開している。
なお、これらは以下で紹介する動作をimageのbuildの際に既に行ってしまっている、もしくはシェルスクリプトに含んでしまっているため、注意していただきたい。ゼロからやりたい方は上記のimageをベースに自分で環境構築することをおすすめする。
https://github.com/yu9824/conda-skeleton
【参考】プラットフォームを指定したimageの利用の仕方
たとえば、Dockerfileに書き込むのであれば以下。
FROM --platform=amd64 continuumio/miniconda3:4.11.0
直接docker hubにあるものをrunしたい場合は、以下。
docker run -it --rm --platform linux/amd64 continuumio/miniconda3:4.11.0 /bin/bash
参考
- KeyError: ‘extras_require’ while running conda skeleton - Github issue
- continuumio/miniconda3: 4.11.0 - Docker hub