azure-cli: Support PEP 420 -- Implicit Namespace Packages
As Python 2 has been deprecated, we should move away from the pkg_resources approach and use PEP 420 – Implicit Namespace Packages.
Importing pkg_resources will add a 100ms~200ms delay to CLI’s loading time.
$ time python -c "import pkg_resources"
real 0m0.153s
user 0m0.137s
sys 0m0.016s
time python -X importtime -m azure.cli version -h 2>perf.log
tuna perf.log

This is discussed at https://github.com/pypa/setuptools/issues/510 which affects many projects but still doesn’t have a proper fix.
Moreover, on Linux, the wrapper ~/env38/bin/az created by Easy Install also requires pkg_resources:
#!/home/admin/env38/bin/python
# EASY-INSTALL-DEV-SCRIPT: 'azure-cli==2.5.1','az'
__requires__ = 'azure-cli==2.5.1'
__import__('pkg_resources').require('azure-cli==2.5.1')
__file__ = '/home/admin/azure-cli/src/azure-cli/az'
with open(__file__) as f:
exec(compile(f.read(), __file__, 'exec'))
This makes az installed via azdev even slower.
For comparison, directly run azure.cli:
$ time python -m azure.cli version -h
real 0m0.261s
user 0m0.238s
sys 0m0.024s
Run the Easy Install wrapper:
$ time python ~/env38/bin/az version -h
real 0m0.822s
user 0m0.779s
sys 0m0.044s
python -X importtime ~/env38/bin/az version -h 2>perf.log
tuna perf.log

In our Linux release, we package our own wrapper src/azure-cli/az, so it doesn’t suffer from the slowness of this Easy Install wrapper.
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Comments: 19 (18 by maintainers)
Yes, you can kill them now, their only purpose is Python 2, that you don’t handle anymore. Remove them all from everywhere.
@jiasli
azure\cli\__init__.py,azure\cli\__init__.py. This file shouldn’t exist.The debate we have with @zooba is solely about this line, and nothing else, the rest of the recommended guidelines still applies. Once everything else is fixed, and we’re down the decide this, we’ll settle the debate 😃. In the meantime, keep this line since it’s there, but there is many things to still fix it seems.
I don’t have time for 2 cents (plus I live in a country without a penny so I couldn’t give you 2 cents even if I wanted to 😉 ).
Side note @jiasli that I didn’t realize before @zooba comment, in real life CLI installation, you shouldn’t have the
pkg_resourcesline anyway, since you’re not supposed to rely on nspkg packages today already. So I think you did you measurement on a dev install of the CLI. In order to get numbers that represents reality, I would encourage you do them on a real install.If you do have
pkg_resourceson any real CLI installation, that’s a bug and that’s parallel to the discussion if we should use PEP420 (no__init__.py) or regular package (empty__init__.pyfile)See also https://github.com/Azure/azure-cli/issues/8164
Since you don’t need Python 2, your situation is way simpler than it was when I created that issue, but might give you some insights. Feel free to contact me if you have questions on packaging.