This page lists specific things that
- the Python packaging community wants
- are fairly well-scoped
- would happen much faster if the Packaging Working Group got funding to achieve them (through donations or grants/directed gifts)
Please contact the Packaging WG to ask us to estimate how much one of these improvements would cost; we'll get back to you within a few business days.
This is roughly prioritized by urgency and impact, but is not a roadmap.
PyTorch, TensorFlow, and many other Python packages (especially science packages) suffer from cross-platform installability problems, which affect both users and developers. Packagers and users prefer using built distributions (usually in the wheel format); publishing built distributions increases convenience for end users because source code is pre-compiled, which significantly reduces install time (e.g., from 10+ minutes to several seconds).
Supporting the multifarious Linux platforms is something we've been lagging on; we are still finishing up the rollout of manylinux2010 and recently approved the new standard manylinux2014. But even so, packagers will have to build their own wheels to release packages, which can be fiddly, brittle, and time-consuming.
We'd like help to:
- Implement the manylinux2014 standard throughout the toolchain, to help users move off already end-of-life'd Linux distributions and get on a better foundation for security patches
- Finish the "perennial" manylinux PEP and get it approved and implemented to reduce the churn of hardcoded, brittle manylinux standards and react better to ongoing platform change
- Create a generic wheel-building service to make releases faster and more robust
We need funding for specification research and writing, backend and frontend development, testing, DevOps/infrastructure/platform services, user experience work, technical writing for end users, project management, and community outreach.
We need funding to ensure core packaging tools work well with each other;
currently they aren't seamlessly interoperable. See the integration-test
project. This will help us get
faster at testing and rolling out bugfixes and features for all Python
packaging and distribution tools:
well-known projects like pip
, virtualenv
, and wheel
, but also all the
downstream projects that depend on them.
The Python Package Index, a key platform for Python developers, has a browser interface, but most people use PyPI by hitting its API endpoints with client applications such as pip
. PyPI has a minimal download API that does not implement many features that users have requested. The lack of a full-featured download API in Warehouse (the PyPI codebase) blocks many improvements, including:
- Light-bandwidth metadata-only API
calls and JSON
standardization
that would enable better downloads, installations, dependency resolution
features, and troubleshooting for
pip
and other clients - RSS feeds that other platforms could reuse to get PyPI updates in user tooling
- Security notification feeds
- Caching for the bandersnatch mirroring client
We'd like to architect and implement a new Warehouse download API to support these features, and deprecate and decommission the old endpoints. This requires backend development work, technical writing, user experience research, and publicity and coordination work within Python's community.
There is a part of the Python standard library
called distutils
, and some
users directly use it. We want users to instead switch to the supported
toolchain, which uses
setuptools
, and we want to move all the functionality from distutils
into
setuptools
. This requires backend development work, technical writing,
project management, and publicity work within Python's community.
Developers of Python projects want to be able to use "editable installations"
-- changing the code of applications while simultaneously running those
applications. Right now, the support for that kind of usage is rough and not
standardized across different tools. Packaging tools maintainers have rough
plans for how to standardize the feature and support for
it
using distutils
and setuptools
. We would like funding for developing a proof of
concept and coordinating subsequent standards changes, tool improvements, and
documentation. This requires backend development work, technical writing, and
coordination and publicity work within Python's community.
setuptools
does not yet
allow project creators to use
the new pyproject.toml
standard configuration file
to configure setuptools
behavior. This distracts and confuses package creators, and prevents platforms
and tools from depending on the presence of standard pyproject.toml
metadata
in packages. We'd like to implement pyproject.toml
configuration support in
setuptools
. This requires backend development work, technical writing, and
coordination and publicity work among Python users.
If we audit and update PyPI metadata for existing projects based on already-uploaded artifacts, we can publish information about what packages depend on each other and on certain environments, and ensure a high-quality API for many tools to reuse and build upon. The current PyPI upload API relies on the upload client extracting the metadata and supplying it with the first upload request, and that isn't a valid assumption for older upload clients. Currently, our constraint is a combination of developer time, compute resources, and privileged backend database access; funding would break this bottleneck.
User experience research, and UX and development implementation work, would make it easier for packagers to create configuration files. We aim to use the UX research work from improvements in pip's user experience and build on them to improve the larger experience of packaging for Python in general.
Our packaging ecosystem relies on a particular structured data format (classifiers) to indicate a package's legal license. However, our current system allows for ambiguity that makes some downstream data display incoherent or very difficult, and doesn't allow for some license specificity that downstream consumers need (Libraries.io and similar projects). Fixing this is a fairly small project, involving Python development, public communications, project management, and potentially a few hours of legal counsel for review.
pip
currently uses requirements.txt
to specify dependencies; it can specify
versions of packages but not hashes. The newer pipfile
format can include hashes, which some users
prefer. But pip
doesn't yet
support pipfile
, so many users are
blocked from using hashes to better secure their Python runtimes. We have made
some progress toward standardizing an interoperable lockfile
format, but we need to finish that
design standardization and consensus-gathering
work
and implement it in pip
, pipenv
, and related tools. We'd need Python
engineering work and project management to develop and deploy this.
Right now, there are ways for package maintainers to test and share draft versions of their upcoming releases, but they cause friction and confusion. So we want to add staged releases -- a temporary state that a release can be in, where PyPI has it and can evaluate it, but hasn't published it yet.
This will:
- let project owners/maintainers preview/test how their package metadata displays on the website, and review where their fresh releases are out of compliance with site and interoperability requirements (preventing the problem of maintainers wanting to re-upload removed files)
- help cross-platform package maintainers coordinate dozens of wheels built on multiple machines for simultaneous release
- Provide an interoperability check for toolchain developers, and a testing site for people learning packaging
- Simplify packagers' upload configuration files
- reduce complexity that currently forces maintainers to use confusing "dev" or prerelease version numbers
- Improve security of package uploads, by allowing maintainers to scope upload API tokens to the newly staged package
- Prevent package name conflicts
- Streamline infrastructure maintenance and confusing documentation by letting us take down the separate test.pypi.org staging site
- Provide pre-release warnings to maintainers of packages that fail metadata checks (such as rejecting or warning for packages without Python requirements metadata, or manylinux wheels that fail auditwheel checks -- as we increase the packaging ecology's strictness regarding metadata standards compliance, during the intermediate period where we're warning maintainers/owners about failing strictness checks but not yet blocking releases on those new stricter checks, the package preview feature will help us provide soft warnings.
We'll need database support for understanding the release state ("is this published or not"), user experience and developer support, and testing, security, infrastructure, and project management support.
It's difficult to roll out new features gradually to PyPI's test site or to selected test users. A feature flag system would help us do targeted outreach to particular groups of users, deploy more confidently, and roll back changes when needed. We'd need user experience, front and backend engineer, data analytics, and project management support to develop and deploy this.
Python packagers who need help currently create Sourceforge and GitHub tickets, email mailing lists, tweet at maintainers, and so on. A unified user support ticket system, integrated into Warehouse, would:
- help managers, entrepreneurs, and academics reserve specific package names
- support username changes
- give users a reporting system to quickly flag malware and spam
- provide a transfer system for abandoned/unmaintained projects
- reduce work for PyPI's core developers who currently have to sift through user support issues to find bug reports and feature requests
- enable PyPI admins to better delegate support and moderation work to volunteers
We need funding for backend and frontend development, testing and security checks, DevOps/infrastructure/platform services (including API/email integration), user experience work, technical writing for end users, project management, and community outreach.
To scale up our anti-abuse moderation and help package maintainers with security response, we need to be able to, for instance, mark a release as deprecated or a project as unsupported. This means we need a generic system to add, edit, and remove administrative attributes ("flags" or "statuses") to individual projects and releases. We need support to do the architectural design to implement this. (See notes from this meeting.)
To keep PyPI's users secure, we want to give them
an opt-in communication channel to hear about security vulnerabilities for the packages they use. Implementing this would also give us
architectural support to warn or prevent pip
users who try to
install a PyPI package that's been found to be broken or malware. We
need funding for user experience work, development, testing,
infrastructure, potentially platform services (e.g., SMS), and community
outreach.
Some TODOs that were on this page have now received funding!
This is now funded and we hired developers to work on this project.)
We're partway through a next-generation rewrite of the dependency resolver within pip, Python's package download and installation tool. The project ran into massive technical debt, but the refactoring is nearly finished and prototype functionality is in alpha now. (In-depth explanation by Sebastian Awwad of the problem & our approach, lead developer Pradyun Gedam's initial plan, 2017 status updates, and GitHub issue #988 tracking progress and June 2019 status update, and issue #6536 for planning rollout.)
Funding would support user experience, communications/publicity, and testing work (including developing robust testing/CI infrastructure) as well as core feature development and review.
We need to finish the resolver because so many other improvements are blocked on it:
- adding an "upgrade-all" command to pip
- warning when trying to download or build wheels from incompatible set of packages/requirements
- adding a no-implicit-upgrades strategy
- making PyPI and pip enforce metadata compliance more strictly
- warning the user when uninstalling a package that other packages depend on
- properly respecting constraints
- recording requested and installed extras
- option to show what versions of packages are currently available
- listing packages' dependencies and dependents on PyPI
- minimizing duplication of work between pip and pipenv
- better pipenv functionality
- package namespace support
- moving more code out of Python's standard library so we can release improvements faster
and it would fix so many dependency issues for our users:
- Django installation conflict
- cherrypy/six/cheroot installation conflict
- Spyder downgrade requirement
- boto3/bravado dependency failure
- Ansible/PyOpenSSL/cryptography failure
- extras installation failure
- extras upgrade failure
- breaking installed packages
- elasticsearch/requests failure
- hatch, another packaging tool
And in our larger ecology, this causes installation problems for:
- conda's compatibility with pip
- the Servo browser engine
- numpy and scipy
- Canonical's DevOps tool Juju
- a Cap'n Proto implementation
- toil, awscli, and boto3
- the Mozilla website & icalendar
- certbot, in the past and possibly the future
- TurboGears
- a JIRA API client library
- a WebSocket protocol test suite
- Robot Operating System tooling
This is now funded, thanks to the Chan Zuckerberg Initiative and Mozilla Open Source Support.
pip
's user experience needs to improve by providing
better error messages
and prompts, logs, output, and reporting, and becoming more consistent
across features, to fit the user's mental model better, make hairy
problems easier to untangle, and reduce unintended data loss. pip
's
maintainers have a list of TODOs and need funding so that user experience researchers, UX
designers, developers, and technical writers can spend dedicated time
addressing them.