Since this ties into what's being discussed, I'll mention that on pypa-dev I created an outline of where I saw holes in library support and specs in order to be able to re-constitute pip just from libraries (mostly for the wheel case): https://groups.google.com/forum/#!topic/pypa-dev/91QdZ1vxLT8 .
I'll also mention I already have a design done for PEP 425 compatibility tags that I hope to work on at the Python core dev sprints next month so I can try to get it added to 'packaging'. On Tue, 21 Aug 2018 at 05:11 Paul Moore <p.f.mo...@gmail.com> wrote: > On Tue, 21 Aug 2018 at 12:04, Tzu-ping Chung <uranu...@gmail.com> wrote: > > > > Hi, > > > > Dan and I had been doing most of the maintenance work for Pipenv > recently, and as Dan mentioned, > > we have been working on some related projects that poke into pip > internals significantly, so I feel I > > should voice some opinions. I have significantly less experience messing > with pip than Dan, and might > > be able to offer a slightly different perspective. > > Thanks, this is really useful. > > > Pipenv mainly interacts with pip for two things: > install/uninstall/upgrade packages, and to gain information > > about a package (what versions are available, what dependencies does a > particular version has, etc.). > > For the former case, we are currently using it with subprocesses, and it > is likely the intended way of > > interaction. I have to say, however, that the experience is not > flawless. pip has a significant startup time, > > and does not offer chances for interaction once it is started on > running, so we really don’t have a good > > way to, for example, provide installation progress bar for the user, > unless we parse pip’s stdout directly. > > These are not essential to Pipenv’s functionality, however, so they are > more like an annoyance rather > > than glaring problems. > > Yes, that's a good point. A programmatic API to do installs would > presumably give much better means of progress reporting, etc. > Unfortunately, it's nowhere near as simple as we'd like, because pip > messes with global state all over the place, so if you just called the > old "pip.main" (before we moved it) you got things like your logging > config, your IO streams and such messed up. It also broke if used in > the presence of threads. Using a subprocess isn't just to protect our > internal APIs, it's also to protect the caller's global state. So > there's more work there than it would seem, and it's likely to affect > the fundamental assumptions of a lot of pip's internal code, but I > agree it would help with a lot of use cases. > > The subprocess overhead is also something I can relate to. I'm heavily > running the pip test suite at the moment, and I'm royally sick of the > runtime from all the process spawning :-( > > But as you say, it's something we can live with for now. > > > The other thing Pipenv uses pip for—getting package information—is more > troubling (to me, personally). > > Pipenv has a slightly different need from pip regarding dependency > resolution. pip can (and does) freely > > drop dependencies that does not match the current environment, but > Pipenv needs to generate a lock file > > for an abstract platform that works for, say, both macOS and Windows. > This means pip’s resolver is not > > useful for us, and we need to implement our own. Our own resolver, > however, still needs to know about > > packages it gets, and we are left with two choices: a. try re-implement > the same logic, or b. use pip internals > > to cobble something together. > > > > We tried to go for a. for a while, but as you’d easily imagine, our own > implementation is buggy, cannot > > handle edge cases nearly as well, and fielded a lot of complaints along > the lines of “I can do this in pip, why > > can’t I do the same in Pipenv”. One example is how package artifacts are > discovered. At my own first > > glance, I thought to myself this wouldn’t be that hard—we have a simple > API, and the naming conventions are > > there, so as long as we specify sources in Pipfile (we do), we should be > able to discover them no problem. > > I couldn’t be more wrong. There are find_links, dependency_links, > pip.conf for the user, for the machine, all > > sorts of things, and for everything quirk in pip we don’t replicate > 100%, issues are filed urging use to fix it. > > In the end we gave up and use pip’s internal PackageFinder instead. > > This is exactly the reason a common library/API and clear spec would > be worth working on. In effect you're having to treat "how pip works" > as a de facto standard that people expect you to follow, and that's > not practical. I've hit this issue as well (luckily, only in adhoc > code) where I want to "get files like pip does" but doing anything > beyond a basic minimum is a nightmare. > > One thought on the package finder - distlib implements a finder, and > while it doesn't include a lot of the things you mention, it does > represent a competing implementation, and there's likely some mileage > in trying to have the two implementations converge on a reasonable > split between "standard finder behaviour" and "application (pip) > specific details". (For example, I think it would be entirely > reasonable for pipenv to say "we're not going to respect an > environment variable PIP_FIND_LINKS", but conversely it's a reasonable > user request to say "we'd like a standard way to specify local package > directories that all tools will respect"). > > I've said it before but it bears repeating - I'd fully support someone > pulling chunks of pip's code out and making them into supported 3rd > party libraries that we could use as a client. I doubt any of the > other pip developers would object either. But doing it properly is far > from a simple undertaking, and I've yet to see any real sign of anyone > offering to actually do that work, rather than just talking about it. > With the exception of what you guys did on pipenv, and ultimately that > ended up with you giving up and calling pip's internals... > > > This is a big problem going forward, and we are fully aware of that. The > strategy we are taking at the > > moment is to try to limit the surface area of pip internals usage. Dan > mentioned we have been building a > > resolver for Pipenv[1], > > This really ought to be co-ordinated with Pradyun's work on the pip > resolver over at https://github.com/pradyunsg/zazo... > > > and we took the chance to work toward centralising things interfacing > with pip > > internals. Those are still internals, of course, but we now have a > relatively good idea what we actually need > > from pip, and I’d be extremely happy if some parts of pip can come out > as standalone with official blessing. > > The things I am particularly interested in (since they would be > beneficial for Pipenv) are: > > > > * VcsSupport > > * PackageFinder > > * WheelBuilder (and everything that comes with it like the wheel cache, > preparer, unpack_url, etc.) > > All of those sound like reasonable things to consider. Although > "everything that comes with" the WheelBuilder is quite a lot, in > practice (you didn't explicitly mention the requirement object, and > that's a big one). > > I don't think anyone has a problem with this sort of stuff in > principle, it's just getting the resources to do it. I wonder if any > sort of sponsorship would offer an option here? Although it's not just > the initial development, we'd need to make sure we had sustainable > support (or at least, it wasn't any worse than what we have now...) > >
-- Distutils-SIG mailing list -- distutils-sig@python.org To unsubscribe send an email to distutils-sig-le...@python.org https://mail.python.org/mm3/mailman3/lists/distutils-sig.python.org/ Message archived at https://mail.python.org/mm3/archives/list/distutils-sig@python.org/message/4NT5UYTXKYLRD4NNKJKHKXCHAZSXAUCI/