Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

uv fails to resolve apache-airflow[all]==2.8.4 where pip succeeds #3078

Closed
notatallshaw opened this issue Apr 16, 2024 · 7 comments
Closed
Assignees
Labels
compatibility Compatibility with a specification or another tool

Comments

@notatallshaw
Copy link
Contributor

notatallshaw commented Apr 16, 2024

Streps to reproduce

  1. Linux, Python 3.11, uv 0.1.32
  2. Command: uv pip install --dry-run apache-airflow[all]==2.8.4

Error

error: Failed to download and build: apache-beam==2.2.0
  Caused by: Failed to build: apache-beam==2.2.0
  Caused by: Build backend failed to determine extra requires with `build_wheel()` with exit status: 1
--- stdout:

--- stderr:
<string>:24: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
Traceback (most recent call last):
  File "<string>", line 14, in <module>
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 325, in get_requires_for_build_wheel
    return self._get_build_requires(config_settings, requirements=['wheel'])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 295, in _get_build_requires
    self.run_setup()
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 487, in run_setup
    super().run_setup(setup_script=setup_script)
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 311, in run_setup
    exec(code, locals())
  File "<string>", line 61, in <module>
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 497, in get_distribution
    dist = get_provider(dist)
           ^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 384, in get_provider
    return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 937, in require
    needed = self.resolve(parse_requirements(requirements))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 798, in resolve
    dist = self._resolve_dist(
           ^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 839, in _resolve_dist
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'pip' distribution was not found and is required by the application
---

Expected

Same as pip, can install fine:

$ pip install --dry-run apache-airflow[all]==2.8.4
...
Would install Authlib-1.3.0 Babel-2.14.0 ConfigUpdater-3.2 Deprecated-1.2.14 Flask-2.2.5 Flask-AppBuilder-4.3.11 Flask-Babel-2.0.0 Flask-Bcrypt-1.0.1 Flask-Caching-2.1.0 Flask-JWT-Extended-4.6.0 Flask-Limiter-3.5.1 Flask-Login-0.6.3 Flask-SQLAlchemy-2.5.1 Flask-Session-0.5.0 Flask-WTF-1.2.1 JPype1-1.5.0 JayDeBeApi-1.2.3 Jinja2-3.1.3 Js2Py-0.74 Mako-1.3.3 Markdown-3.6 MarkupSafe-2.1.5 PyAthena-3.6.0 PyGithub-2.3.0 PyHive-0.7.0 PyJWT-2.8.0 PyNaCl-1.5.0 PyYAML-6.0.1 Pygments-2.17.2 SQLAlchemy-1.4.52 SQLAlchemy-JSONField-1.0.2 SQLAlchemy-Utils-0.41.2 WTForms-3.1.2 Werkzeug-2.2.3 adal-1.2.7 adlfs-2024.4.1 aiobotocore-2.12.3 aiofiles-23.2.1 aiohttp-3.9.5 aioitertools-0.11.0 aiosignal-1.3.1 alembic-1.13.1 alibabacloud-adb20211201-1.3.3 alibabacloud-tea-0.3.6 alibabacloud_credentials-0.3.2 alibabacloud_endpoint_util-0.0.3 alibabacloud_gateway_spi-0.0.1 alibabacloud_openapi_util-0.2.2 alibabacloud_tea_openapi-0.3.8 alibabacloud_tea_util-0.3.11 alibabacloud_tea_xml-0.0.2 aliyun-python-sdk-core-2.15.1 aliyun-python-sdk-kms-2.16.2 amqp-5.2.0 analytics-python-1.2.9 annotated-types-0.6.0 anyio-4.3.0 apache-airflow-2.8.4 apache-airflow-providers-airbyte-3.7.0 apache-airflow-providers-alibaba-2.7.3 apache-airflow-providers-amazon-8.20.0 apache-airflow-providers-apache-beam-5.6.3 apache-airflow-providers-apache-cassandra-3.4.2 apache-airflow-providers-apache-drill-2.6.1 apache-airflow-providers-apache-druid-3.9.0 apache-airflow-providers-apache-flink-1.3.0 apache-airflow-providers-apache-hdfs-4.3.3 apache-airflow-providers-apache-hive-8.0.0 apache-airflow-providers-apache-impala-1.3.0 apache-airflow-providers-apache-kafka-1.3.1 apache-airflow-providers-apache-kylin-3.5.0 apache-airflow-providers-apache-livy-3.7.3 apache-airflow-providers-apache-pig-4.3.0 apache-airflow-providers-apache-pinot-4.3.1 apache-airflow-providers-apache-spark-4.7.2 apache-airflow-providers-apprise-1.2.2 apache-airflow-providers-arangodb-2.4.1 apache-airflow-providers-asana-2.4.1 apache-airflow-providers-atlassian-jira-2.5.1 apache-airflow-providers-celery-3.6.2 apache-airflow-providers-cloudant-3.4.1 apache-airflow-providers-cncf-kubernetes-8.1.0 apache-airflow-providers-cohere-1.1.3 apache-airflow-providers-common-io-1.3.1 apache-airflow-providers-common-sql-1.12.0 apache-airflow-providers-databricks-6.2.0 apache-airflow-providers-datadog-3.5.1 apache-airflow-providers-dbt-cloud-3.7.1 apache-airflow-providers-dingding-3.4.0 apache-airflow-providers-discord-3.6.0 apache-airflow-providers-docker-3.10.0 apache-airflow-providers-elasticsearch-5.3.4 apache-airflow-providers-exasol-4.4.3 apache-airflow-providers-facebook-3.4.0 apache-airflow-providers-ftp-3.8.0 apache-airflow-providers-github-2.5.1 apache-airflow-providers-google-10.17.0 apache-airflow-providers-grpc-3.4.1 apache-airflow-providers-hashicorp-3.6.4 apache-airflow-providers-http-4.10.1 apache-airflow-providers-imap-3.5.0 apache-airflow-providers-influxdb-2.4.1 apache-airflow-providers-jdbc-4.2.2 apache-airflow-providers-jenkins-3.5.1 apache-airflow-providers-microsoft-azure-10.0.0 apache-airflow-providers-microsoft-mssql-3.6.1 apache-airflow-providers-microsoft-psrp-2.6.1 apache-airflow-providers-microsoft-winrm-3.4.0 apache-airflow-providers-mongo-4.0.0 apache-airflow-providers-mysql-5.5.4 apache-airflow-providers-neo4j-3.5.0 apache-airflow-providers-odbc-4.5.0 apache-airflow-providers-openai-1.1.0 apache-airflow-providers-openfaas-3.4.0 apache-airflow-providers-openlineage-1.7.0 apache-airflow-providers-opensearch-1.1.2 apache-airflow-providers-opsgenie-5.5.0 apache-airflow-providers-oracle-3.9.2 apache-airflow-providers-pagerduty-3.6.2 apache-airflow-providers-papermill-3.6.2 apache-airflow-providers-pgvector-1.1.0 apache-airflow-providers-pinecone-1.1.2 apache-airflow-providers-postgres-5.10.2 apache-airflow-providers-presto-5.4.2 apache-airflow-providers-redis-3.6.1 apache-airflow-providers-salesforce-5.6.3 apache-airflow-providers-samba-4.6.0 apache-airflow-providers-segment-3.4.0 apache-airflow-providers-sendgrid-3.4.0 apache-airflow-providers-sftp-4.9.1 apache-airflow-providers-singularity-3.4.0 apache-airflow-providers-slack-8.6.2 apache-airflow-providers-smtp-1.6.1 apache-airflow-providers-snowflake-5.4.0 apache-airflow-providers-sqlite-3.7.1 apache-airflow-providers-ssh-3.10.1 apache-airflow-providers-tableau-4.4.2 apache-airflow-providers-tabular-1.4.1 apache-airflow-providers-telegram-4.4.0 apache-airflow-providers-trino-5.6.3 apache-airflow-providers-vertica-3.7.1 apache-airflow-providers-weaviate-1.3.4 apache-airflow-providers-yandex-3.10.0 apache-airflow-providers-zendesk-4.6.0 apache-beam-2.55.1 apispec-6.6.0 apprise-1.7.6 argcomplete-3.3.0 asana-3.2.2 asgiref-3.8.1 asn1crypto-1.5.1 asttokens-2.4.1 asyncssh-2.14.2 atlasclient-1.0.0 atlassian-python-api-3.41.11 attrs-23.2.0 azure-batch-14.2.0 azure-common-1.1.28 azure-core-1.30.1 azure-cosmos-4.6.0 azure-datalake-store-0.0.53 azure-identity-1.16.0 azure-keyvault-secrets-4.8.0 azure-kusto-data-4.4.0 azure-mgmt-containerinstance-10.1.0 azure-mgmt-containerregistry-10.3.0 azure-mgmt-core-1.4.0 azure-mgmt-cosmosdb-9.4.0 azure-mgmt-datafactory-6.1.0 azure-mgmt-datalake-nspkg-3.0.1 azure-mgmt-datalake-store-0.5.0 azure-mgmt-nspkg-3.0.2 azure-mgmt-resource-23.0.1 azure-mgmt-storage-21.1.0 azure-nspkg-3.0.2 azure-servicebus-7.12.1 azure-storage-blob-12.19.1 azure-storage-file-datalake-12.14.0 azure-storage-file-share-12.15.0 azure-synapse-artifacts-0.18.0 azure-synapse-spark-0.7.0 backoff-2.2.1 bcrypt-4.1.2 beautifulsoup4-4.12.3 billiard-4.2.0 bitarray-2.9.2 black-24.4.0 blinker-1.7.0 boto3-1.34.69 botocore-1.34.69 cachelib-0.9.0 cachetools-5.3.3 cassandra-driver-3.29.1 cattrs-23.2.3 celery-5.3.6 certifi-2024.2.2 cffi-1.16.0 cgroupspy-0.2.3 chardet-5.2.0 charset-normalizer-3.3.2 ciso8601-2.3.1 click-8.1.7 click-didyoumean-0.3.1 click-plugins-1.1.1 click-repl-0.3.0 clickclick-20.10.2 cloudant-2.15.0 cloudpickle-2.2.1 cohere-4.57 colorama-0.4.6 colorlog-4.8.0 comm-0.2.2 confluent-kafka-2.3.0 connexion-2.14.2 crcmod-1.7 cron-descriptor-1.4.3 croniter-2.0.3 cryptography-41.0.7 curlify-2.2.1 databricks-sql-connector-2.9.5 datadog-0.49.1 db-dtypes-1.2.0 debugpy-1.8.1 decorator-5.1.1 defusedxml-0.7.1 dill-0.3.1.1 distlib-0.3.8 distro-1.9.0 dnspython-2.6.1 docker-7.0.0 docopt-0.6.2 docstring_parser-0.16 docutils-0.21.1 elastic-transport-8.13.0 elasticsearch-8.13.0 email-validator-1.3.1 entrypoints-0.4 et-xmlfile-1.1.0 eventlet-0.36.1 executing-2.0.1 facebook_business-19.0.3 fastavro-1.9.4 fasteners-0.19 fastjsonschema-2.19.1 filelock-3.13.4 flower-2.0.1 frozenlist-1.4.1 fsspec-2024.3.1 future-1.0.0 gcloud-aio-auth-4.2.3 gcloud-aio-bigquery-7.1.0 gcloud-aio-storage-9.2.0 gcsfs-2024.3.1 geomet-0.2.1.post1 gevent-24.2.1 google-ads-23.1.0 google-analytics-admin-0.22.7 google-api-core-2.18.0 google-api-python-client-2.126.0 google-auth-2.29.0 google-auth-httplib2-0.2.0 google-auth-oauthlib-1.2.0 google-cloud-aiplatform-1.47.0 google-cloud-appengine-logging-1.4.3 google-cloud-audit-log-0.2.5 google-cloud-automl-2.13.3 google-cloud-batch-0.17.18 google-cloud-bigquery-3.20.1 google-cloud-bigquery-datatransfer-3.15.2 google-cloud-bigtable-2.23.1 google-cloud-build-3.24.0 google-cloud-compute-1.18.0 google-cloud-container-2.45.0 google-cloud-core-2.4.1 google-cloud-datacatalog-3.19.0 google-cloud-dataflow-client-0.8.10 google-cloud-dataform-0.5.9 google-cloud-dataplex-1.13.0 google-cloud-dataproc-5.9.3 google-cloud-dataproc-metastore-1.15.3 google-cloud-dlp-3.16.0 google-cloud-kms-2.21.3 google-cloud-language-2.13.3 google-cloud-logging-3.10.0 google-cloud-memcache-1.9.3 google-cloud-monitoring-2.20.0 google-cloud-orchestration-airflow-1.12.1 google-cloud-os-login-2.14.3 google-cloud-pubsub-2.21.1 google-cloud-redis-2.15.3 google-cloud-resource-manager-1.12.3 google-cloud-run-0.10.5 google-cloud-secret-manager-2.19.0 google-cloud-spanner-3.44.0 google-cloud-speech-2.26.0 google-cloud-storage-2.16.0 google-cloud-storage-transfer-1.11.3 google-cloud-tasks-2.16.3 google-cloud-texttospeech-2.16.3 google-cloud-translate-3.15.3 google-cloud-videointelligence-2.13.3 google-cloud-vision-3.7.2 google-cloud-workflows-1.14.3 google-crc32c-1.5.0 google-re2-1.1 google-resumable-media-2.7.0 googleapis-common-protos-1.63.0 graphviz-0.20.3 greenlet-3.0.3 grpc-google-iam-v1-0.13.0 grpc-interceptor-0.15.4 grpcio-1.62.1 grpcio-gcp-0.2.2 grpcio-status-1.62.1 gssapi-1.8.3 gunicorn-22.0.0 h11-0.14.0 hdfs-2.7.3 hmsclient-0.1.1 httpcore-0.16.3 httplib2-0.22.0 httpx-0.23.3 humanize-4.9.0 hvac-2.1.0 idna-3.7 ijson-3.2.3 importlib-metadata-6.11.0 importlib_resources-6.4.0 impyla-0.19.0 inflection-0.5.1 influxdb-client-1.41.0 ipykernel-6.29.4 ipython-8.23.0 isodate-0.6.1 itsdangerous-2.2.0 jedi-0.19.1 jmespath-0.10.0 json-merge-patch-0.2 jsonpath-ng-1.6.1 jsonpickle-3.0.4 jsonschema-4.21.1 jsonschema-specifications-2023.12.1 jupyter_client-8.6.1 jupyter_core-5.7.2 kombu-5.3.7 krb5-0.5.1 kubernetes-29.0.0 kubernetes_asyncio-29.0.0 kylinpy-2.8.4 lazy-object-proxy-1.10.0 ldap3-2.9.1 limits-3.10.1 linkify-it-py-2.0.3 lockfile-0.12.2 loguru-0.7.2 looker-sdk-24.4.0 lxml-5.2.1 lz4-4.3.3 markdown-it-py-3.0.0 marshmallow-3.21.1 marshmallow-oneofschema-3.1.1 marshmallow-sqlalchemy-0.26.1 matplotlib-inline-0.1.7 mdit-py-plugins-0.4.0 mdurl-0.1.2 more-itertools-10.2.0 msal-1.28.0 msal-extensions-1.1.0 msrest-0.7.1 msrestazure-0.6.4.post1 multi_key_dict-2.0.3 multidict-6.0.5 mypy-extensions-1.0.0 mysql-connector-python-8.3.0 mysqlclient-2.2.4 nbclient-0.10.0 nbformat-5.10.4 neo4j-5.19.0 nest-asyncio-1.6.0 numpy-1.26.4 oauthlib-3.2.2 objsize-0.7.0 openai-1.20.0 openlineage-integration-common-1.12.0 openlineage-python-1.12.0 openlineage_sql-1.12.0 openpyxl-3.1.2 opensearch-py-2.5.0 opentelemetry-api-1.24.0 opentelemetry-exporter-otlp-1.24.0 opentelemetry-exporter-otlp-proto-common-1.24.0 opentelemetry-exporter-otlp-proto-grpc-1.24.0 opentelemetry-exporter-otlp-proto-http-1.24.0 opentelemetry-exporter-prometheus-0.45b0 opentelemetry-proto-1.24.0 opentelemetry-sdk-1.24.0 opentelemetry-semantic-conventions-0.45b0 opsgenie-sdk-2.1.5 oracledb-2.1.2 ordered-set-4.1.0 orjson-3.10.1 oss2-2.18.4 packaging-24.0 pandas-2.1.4 pandas-gbq-0.22.0 pandas-stubs-2.2.1.240316 papermill-2.5.0 paramiko-3.4.0 parso-0.8.4 pathspec-0.12.1 pbr-6.0.0 pdpyras-5.2.0 pendulum-3.0.0 pexpect-4.9.0 pgvector-0.2.5 pinecone-client-2.2.4 pinotdb-5.1.6 platformdirs-4.2.0 pluggy-1.4.0 ply-3.11 plyvel-1.5.1 portalocker-2.8.2 presto-python-client-0.8.4 prison-0.2.1 prometheus_client-0.20.0 prompt-toolkit-3.0.43 proto-plus-1.23.0 protobuf-4.25.3 psutil-5.9.8 psycopg2-binary-2.9.9 ptyprocess-0.7.0 pure-eval-0.2.2 pure-sasl-0.6.2 py4j-0.10.9.7 pyOpenSSL-24.1.0 pyarrow-14.0.2 pyarrow-hotfix-0.6 pyasn1-0.5.1 pyasn1-modules-0.3.0 pycountry-23.12.11 pycparser-2.22 pycryptodome-3.20.0 pydantic-2.7.0 pydantic_core-2.18.1 pydata-google-auth-1.8.2 pydot-1.4.2 pydruid-0.6.6 pyexasol-0.25.2 pyjsparser-2.7.1 pykerberos-1.2.4 pymongo-4.6.3 pymssql-2.3.0 pyodbc-5.1.0 pyparsing-3.1.2 pypsrp-0.8.1 pyspark-3.5.1 pyspnego-0.10.2 python-arango-7.9.1 python-daemon-3.0.1 python-dateutil-2.9.0.post0 python-dotenv-1.0.1 python-http-client-3.3.7 python-jenkins-1.8.2 python-ldap-3.4.4 python-nvd3-0.15.0 python-slugify-8.0.4 python-telegram-bot-20.2 python3-saml-1.16.0 pytz-2024.1 pywinrm-0.4.3 pyzmq-26.0.0 reactivex-4.0.4 redis-5.0.3 redshift-connector-2.1.1 referencing-0.34.0 regex-2024.4.16 requests-2.31.0 requests-file-2.0.0 requests-kerberos-0.14.0 requests-ntlm-1.2.0 requests-oauthlib-1.3.1 requests-toolbelt-1.0.0 rfc3339-validator-0.1.4 rfc3986-1.5.0 rich-13.7.1 rich-argparse-1.4.0 rpds-py-0.18.0 rsa-4.9 s3fs-2024.3.1 s3transfer-0.10.1 scramp-1.4.5 scrapbook-0.5.0 sendgrid-6.11.0 sentry-sdk-1.45.0 setproctitle-1.3.3 setuptools-66.1.1 shapely-2.0.4 simple-salesforce-1.12.6 six-1.16.0 slack_sdk-3.27.1 smbprotocol-1.13.0 sniffio-1.3.1 snowflake-connector-python-3.8.1 snowflake-sqlalchemy-1.5.2 sortedcontainers-2.4.0 soupsieve-2.5 spython-0.3.13 sqlalchemy-bigquery-1.10.0 sqlalchemy-redshift-0.8.14 sqlalchemy-spanner-1.6.2 sqlalchemy_drill-1.1.4 sqlparse-0.5.0 sshtunnel-0.4.0 stack-data-0.6.3 starkbank-ecdsa-2.2.0 statsd-4.0.1 tableauserverclient-0.25 tabulate-0.9.0 tenacity-8.2.3 termcolor-2.4.0 text-unidecode-1.3 thrift-0.16.0 thrift-sasl-0.4.3 time-machine-2.14.1 tomlkit-0.12.4 tornado-6.4 tqdm-4.66.2 traitlets-5.14.2 trino-0.328.0 types-pytz-2024.1.0.20240203 typing-3.7.4.3 typing_extensions-4.11.0 tzdata-2024.1 tzlocal-5.2 uc-micro-py-1.0.3 unicodecsv-0.14.1 universal-pathlib-0.1.4 uritemplate-4.1.1 urllib3-1.26.18 validators-0.28.0 vertica-python-1.3.8 vine-5.1.0 virtualenv-20.25.1 watchtower-3.1.0 wcwidth-0.2.13 weaviate-client-3.26.2 websocket-client-1.7.0 wrapt-1.16.0 xmlsec-1.3.13 xmltodict-0.13.0 yandex-query-client-0.1.3 yandexcloud-0.271.0 yarl-1.9.4 zeep-4.2.1 zenpy-2.0.47 zipp-3.18.1 zope.event-5.0 zope.interface-6.3 zstandard-0.22.0
@notatallshaw
Copy link
Contributor Author

notatallshaw commented Apr 16, 2024

One issue could be pip has a preference on what to backtrack on based on certain heuristics of the users requirements, see:

Whereas my understanding is uv does not apply a preference like this.

@charliermarsh
Copy link
Member

We added the heuristics in #3087 but this still fails for me, for a different reason related to the relationship between extras and the base package. I have some ideas on how to fix it.

@notatallshaw
Copy link
Contributor Author

notatallshaw commented Apr 17, 2024

We added the heuristics in #3087 but this still fails for me, for a different reason related to the relationship between extras and the base package. I have some ideas on how to fix it.

Yeah, I was only speculating that pip's heuristics are part of it.

With regards to extras, pip has an optimization that "constrains" extras together with their base requirements: pypa/pip#12095, don't know if that approach will be helpful to you, as no idea how uv handles extras, but for some use cases it was a big performance boost for pip.

Also, my understanding is pubgrub-rs strongly implements CDCL to resolve, whereas I would describe pip's approach as "weakly" implementing CDCL, so the path taken through the resolution graph will always be a little different. Though in this case I would think uv's approach would be better, and I do hope to eventually improve pip here and make it's approach to CDCL stronger.

@charliermarsh
Copy link
Member

Unfortunately I still can't get this to avoid going down the apache-beam==2.2.0 branch. I may need to map out the entire path to that requirement to really understand it.

@notatallshaw
Copy link
Contributor Author

Unfortunately I still can't get this to avoid going down the apache-beam==2.2.0 branch. I may need to map out the entire path to that requirement to really understand it.

I won't have time today, but I'll try and make a simpler set of requirements that reproduces this issue. apache-airflow[all] is probably too big to look at the entire path by hand, unless you have exceptional tooling.

@notatallshaw
Copy link
Contributor Author

notatallshaw commented Apr 18, 2024

Simplifying uv fails with the requirement apache-airflow[apache-beam]==2.8.4.

When I look at the metadata of apache-airflow this extra adds the unbound requirement apache-airflow-providers-apache-beam, new versions of apache-airflow-providers-apache-beam but a reasonable lower bound on apache-beam, but older ones do not.

Spending a lot of time playing around with requirements, I found the issue was a combination of dill and apache-airflow-providers-apache-beam==1.0.0, simplifying further I found pip is able to resolve this and uv is not:

dill>=0.2.2
apache-beam<=2.49.0

Edit: Constrained failing requirements even further, and deleted the below comment as I wasn't able to reproduce the results this morning and I don't want people to take it as true if I can't reproduce it. Further I want to investigate why pip skips over apache-beam==2.2.0 in several scenarios I tried this morning.

@notatallshaw
Copy link
Contributor Author

notatallshaw commented Nov 7, 2024

Okay, I think I've found why pip succeeds here and uv fails, and it's not going to be intuitive.

So, currently, pip has a preference on "backtrack causes": https://github.com/pypa/pip/blob/24.3.1/src/pip/_internal/resolution/resolvelib/provider.py#L192

But what are backtrack causes? You might assume that they are the causes that have disjoint requirements, but it turns out resolvelib is sufficiently generic that it doesn't have a concept of disjoint. It just has a concept of that a cause was known to be involved in a failure. So for example, let's say you have A depends on D > 1, B depends on D > 2, and C depends on D < 2, then resolvelib considers A, B, and C to all be causes, even though A's requirements aren't disjoint from either B or C.

The effect of this is that pip sort of "wanders" around the possible requirements when there are more than 2 possible causes, resulting in it sometimes being able to find an "unintuitive" solution at the cost of it sometimes being very slow.

If I make resolvelib "disjoint aware": pypa/pip@main...notatallshaw:pip:speedy-resolve, then pip ends up getting exactly the same error.

As such, I think I'm going to close this issue, as I think uv is doing the right thing here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compatibility Compatibility with a specification or another tool
Projects
None yet
Development

No branches or pull requests

3 participants