Repository: Cloud-CV/evalai-cli
Issue: Python installation error
Root cause: External Dependency Breakage

I am using `Python 3.13.0` on `Windows 11`, and following the tutorial, I attempt to run `pip install evalai`. However, it throws the following error:
```
Collecting evalai
  Downloading evalai-1.3.18-py3-none-any.whl.metadata (3.1 kB)
Collecting beautifulsoup4==4.7.1 (from evalai)
  Downloading beautifulsoup4-4.7.1-py3-none-any.whl.metadata (3.0 kB)
Collecting beautifultable==0.7.0 (from evalai)
  Downloading beautifultable-0.7.0-py2.py3-none-any.whl.metadata (9.3 kB)
Collecting boto3>=1.9.88 (from evalai)
  Downloading boto3-1.37.7-py3-none-any.whl.metadata (6.6 kB)
Collecting click==6.7 (from evalai)
  Downloading click-6.7-py2.py3-none-any.whl.metadata (424 bytes)
Collecting docker==3.6.0 (from evalai)
  Downloading docker-3.6.0-py2.py3-none-any.whl.metadata (3.8 kB)
Collecting lxml==4.6.2 (from evalai)
  Downloading lxml-4.6.2.tar.gz (3.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 1.3 MB/s eta 0:00:00
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting python-dateutil==2.7.3 (from evalai)
  Downloading python_dateutil-2.7.3-py2.py3-none-any.whl.metadata (7.5 kB)
Collecting requests==2.25.1 (from evalai)
  Downloading requests-2.25.1-py2.py3-none-any.whl.metadata (4.2 kB)
Collecting validators==0.12.6 (from evalai)
  Downloading validators-0.12.6.tar.gz (22 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting termcolor==1.1.0 (from evalai)
  Downloading termcolor-1.1.0.tar.gz (3.9 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting tqdm>=4.49.0 (from evalai)
  Downloading tqdm-4.67.1-py3-none-any.whl.metadata (57 kB)
Collecting soupsieve>=1.2 (from beautifulsoup4==4.7.1->evalai)
  Downloading soupsieve-2.6-py3-none-any.whl.metadata (4.6 kB)
Collecting six>=1.4.0 (from docker==3.6.0->evalai)
  Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting websocket-client>=0.32.0 (from docker==3.6.0->evalai)
  Downloading websocket_client-1.8.0-py3-none-any.whl.metadata (8.0 kB)
Collecting docker-pycreds>=0.3.0 (from docker==3.6.0->evalai)
  Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl.metadata (1.8 kB)
Collecting pypiwin32==223 (from docker==3.6.0->evalai)
  Downloading pypiwin32-223-py3-none-any.whl.metadata (236 bytes)
Collecting chardet<5,>=3.0.2 (from requests==2.25.1->evalai)
  Downloading chardet-4.0.0-py2.py3-none-any.whl.metadata (3.5 kB)
Collecting idna<3,>=2.5 (from requests==2.25.1->evalai)
  Downloading idna-2.10-py2.py3-none-any.whl.metadata (9.1 kB)
Collecting urllib3<1.27,>=1.21.1 (from requests==2.25.1->evalai)
  Downloading urllib3-1.26.20-py2.py3-none-any.whl.metadata (50 kB)
Collecting certifi>=2017.4.17 (from requests==2.25.1->evalai)
  Downloading certifi-2025.1.31-py3-none-any.whl.metadata (2.5 kB)
Collecting decorator>=3.4.0 (from validators==0.12.6->evalai)
  Using cached decorator-5.2.1-py3-none-any.whl.metadata (3.9 kB)
Collecting pywin32>=223 (from pypiwin32==223->docker==3.6.0->evalai)
  Using cached pywin32-308-cp313-cp313-win_amd64.whl.metadata (8.3 kB)
Collecting botocore<1.38.0,>=1.37.7 (from boto3>=1.9.88->evalai)
  Downloading botocore-1.37.7-py3-none-any.whl.metadata (5.7 kB)
Collecting jmespath<2.0.0,>=0.7.1 (from boto3>=1.9.88->evalai)
  Downloading jmespath-1.0.1-py3-none-any.whl.metadata (7.6 kB)
Collecting s3transfer<0.12.0,>=0.11.0 (from boto3>=1.9.88->evalai)
  Downloading s3transfer-0.11.4-py3-none-any.whl.metadata (1.7 kB)
Collecting colorama (from tqdm>=4.49.0->evalai)
  Using cached colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Downloading evalai-1.3.18-py3-none-any.whl (35 kB)
Downloading beautifulsoup4-4.7.1-py3-none-any.whl (94 kB)
Downloading beautifultable-0.7.0-py2.py3-none-any.whl (22 kB)
Downloading click-6.7-py2.py3-none-any.whl (71 kB)
Downloading docker-3.6.0-py2.py3-none-any.whl (131 kB)
Downloading python_dateutil-2.7.3-py2.py3-none-any.whl (211 kB)
Downloading requests-2.25.1-py2.py3-none-any.whl (61 kB)
Downloading pypiwin32-223-py3-none-any.whl (1.7 kB)
Downloading boto3-1.37.7-py3-none-any.whl (139 kB)
Downloading tqdm-4.67.1-py3-none-any.whl (78 kB)
Downloading botocore-1.37.7-py3-none-any.whl (13.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.4/13.4 MB 814.1 kB/s eta 0:00:00
Downloading certifi-2025.1.31-py3-none-any.whl (166 kB)
Downloading chardet-4.0.0-py2.py3-none-any.whl (178 kB)
Using cached decorator-5.2.1-py3-none-any.whl (9.2 kB)
Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl (9.0 kB)
Downloading idna-2.10-py2.py3-none-any.whl (58 kB)
Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)
Downloading s3transfer-0.11.4-py3-none-any.whl (84 kB)
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Downloading soupsieve-2.6-py3-none-any.whl (36 kB)
Downloading urllib3-1.26.20-py2.py3-none-any.whl (144 kB)
Downloading websocket_client-1.8.0-py3-none-any.whl (58 kB)
Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Using cached pywin32-308-cp313-cp313-win_amd64.whl (6.5 MB)
Building wheels for collected packages: lxml, termcolor, validators
  Building wheel for lxml (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Building wheel for lxml (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [72 lines of output]
      <string>:64: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
      Building lxml version 4.6.2.
      Building without Cython.
      Building against pre-built libxml2 andl libxslt libraries
      running bdist_wheel
      running build
      running build_py
      creating build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\builder.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\cssselect.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\doctestcompare.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\ElementInclude.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\pyclasslookup.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\sax.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\usedoctest.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\_elementpath.py -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\__init__.py -> build\lib.win-amd64-cpython-313\lxml
      creating build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\__init__.py -> build\lib.win-amd64-cpython-313\lxml\includes
      creating build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\builder.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\clean.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\defs.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\diff.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\ElementSoup.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\formfill.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\html5parser.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\soupparser.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\usedoctest.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\_diffcommand.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\_html5builder.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\_setmixin.py -> build\lib.win-amd64-cpython-313\lxml\html
      copying src\lxml\html\__init__.py -> build\lib.win-amd64-cpython-313\lxml\html
      creating build\lib.win-amd64-cpython-313\lxml\isoschematron
      copying src\lxml\isoschematron\__init__.py -> build\lib.win-amd64-cpython-313\lxml\isoschematron
      copying src\lxml\etree.h -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\etree_api.h -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\lxml.etree.h -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\lxml.etree_api.h -> build\lib.win-amd64-cpython-313\lxml
      copying src\lxml\includes\c14n.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\config.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\dtdvalid.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\etreepublic.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\htmlparser.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\relaxng.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\schematron.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\tree.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\uri.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\xinclude.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\xmlerror.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\xmlparser.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\xmlschema.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\xpath.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\xslt.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\__init__.pxd -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\etree_defs.h -> build\lib.win-amd64-cpython-313\lxml\includes
      copying src\lxml\includes\lxml-version.h -> build\lib.win-amd64-cpython-313\lxml\includes
      creating build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\rng
      copying src\lxml\isoschematron\resources\rng\iso-schematron.rng -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\rng
      creating build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl
      copying src\lxml\isoschematron\resources\xsl\RNG2Schtrn.xsl -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl
      copying src\lxml\isoschematron\resources\xsl\XSD2Schtrn.xsl -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl
      creating build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
      copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_abstract_expand.xsl -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
      copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_dsdl_include.xsl -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
      copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_schematron_message.xsl -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
      copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_schematron_skeleton_for_xslt1.xsl -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
      copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\iso_svrl_for_xslt1.xsl -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
      copying src\lxml\isoschematron\resources\xsl\iso-schematron-xslt1\readme.txt -> build\lib.win-amd64-cpython-313\lxml\isoschematron\resources\xsl\iso-schematron-xslt1
      running build_ext
      building 'lxml.etree' extension
      error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for lxml
  Building wheel for termcolor (pyproject.toml) ... done
  Created wheel for termcolor: filename=termcolor-1.1.0-py3-none-any.whl size=4894 sha256=72587471d04492c387f3a82af0aa0f55348bd91f1d001cac32c5224997c39b22
  Stored in directory: c:\users\zhimi\appdata\local\pip\cache\wheels\0a\a5\07\60ef5219c22c3223a302ea1394b51f4b50bb6fd6238fcfedca
  Building wheel for validators (pyproject.toml) ... done
  Created wheel for validators: filename=validators-0.12.6-py3-none-any.whl size=15086 sha256=e0082fe3e7f8b631d9e1f4ffd1c8de457f12ec2f8d61129fd51260b6f294afbd
  Stored in directory: c:\users\zhimi\appdata\local\pip\cache\wheels\3c\1b\8e\b159f1aea758305b9fd41649d6dceb6395c92c1992edde409a
Successfully built termcolor validators
Failed to build lxml

[notice] A new release of pip is available: 24.2 -> 25.0.1
[notice] To update, run: python.exe -m pip install --upgrade pip
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (lxml)
```

Hi @zhimin-z and maintainers,

I have investigated this issue and found it's caused by the removal of distutils in Python 3.12/3.13 and the lack of pre-compiled lxml wheels for older versions on Python 3.13.

I've submitted a fix in PR #388 that:

Updates lxml to v5.0.0+ for Python 3.12+ to ensure binary wheels are used.

Replaces distutils with packaging to support modern Python versions.

I've verified this fix on Windows 11 with Python 3.13.0.