On 26May2016 0942, Chris Barker wrote:
    An alternative approach would be to stick MSVCP140.DLL into a tiny
    shim wheel and upload that to PyPI, and then wxPython and matplotlib's
    windows wheels could declare a dependency on this msvcp410 wheel.

    Basically this is the idea of my pynativelib proposal,


Yes -- if pynativelib becomes standard practice, then yes, that would be
a good way to handle this issue -- jsut ike any other lib multiple
packages might need.

    (I really need to get back to that... if anyone wants to help sprint
    on this at PyCon let me know :-))


I might -- haven't decided what to sprint on yet -- let's talk. (let's
talk anyway)

This seems like a good solution. I won't be around for sprints, but we can chat about it before then.


        MSVCP140.DLL


    There are two different versions of this DLL for each architecture
    (same name).


got to love Windows! Does the OS do the right thing if they are both
installed? ouch!

If they're installed properly into System32/SysWOW64 (using the official installer), then yes. If you simply drop them into your Python install directory, then no, unless you drop the right one - it has to match the python.exe architecture.


        Unfortunately, it won't "just work". More often than not, it
        will break in weird and very difficult to diagnose ways, as the
        version of msvcp140.dll changes on a regular basis (there are at
        least four different version of it "in the wild" since VS 2015
        released, not counting the preview releases before mid-last year).


oh God. Well, that will  pretty much kill it. So essentially every
single app or lib written in C++ has to ship this dll? And IIUC, folks
that have the compiler installed have SOME version on the system paths,
and who knows what version other arbitrary stuff is linked to? How can
this possibly be considered "Enterprise" software? Wow!

To make it worse, you can only load it once per process. So the first extension to load their private copy wins.

The DLL is designed to be installed using the official installer, statically linked, or embedded as part of an entire application. It's not meant to be injected into someone else's application (which is essentially what Python extension modules are doing).

    There's also a slippery slope argument that would legitimately
    justify shipping all sorts of "common" dependencies with the core
    product. I chose to draw the line at "needed by the core Python
    product", rather than "created by Microsoft" or "used by many
    packages". (Hence vcruntime140.dll is included, despite not having
    forwards-compatibility, and I tried real hard to avoid including
    that one too.)


yeah, a line has to be drawn, and "created by Microsoft" wouldn't make
any sense either. but "standard runtime expected by the compiler" would
-- but, as you say above, you have may have to ship a new version with
your extension anyway -- so it seems adding the feature for distutils to
do that for C++ extensions would both solve the problem and not ship
anything extra with the core install.

It would be possible. It might be simpler to update the default compiler settings to statically link the C++ runtime while still dynamically linking the C runtime (and any project is already capable of doing this on their own - I'm 99% sure it works).

    Finally, unless we demand users are administrators for every
    install, we will quickly have many Python installs using versions of
    msvcp140.dll (or any other dependency) with security
    vulnerabilities, with no way to update them other than a full Python
    release. Installing the regular runtime (which is patched
    automatically) or as part of a package (which can be independently
    updated) is far more feasible. I really don't want to be doing
    security updates for 15 years just to keep an unused DLL secure.


Though we have to do that for msvcp140.dll anyway, yes? god, what a
pain! (and why MS should ship the damn things themselves!)

Maybe, but it's also the same reason why MS doesn't want to ship it themselves either. In fact, all the reasons why we don't want to include it in Python equally apply to Windows - until it's a direct dependency of the product itself, it has a really high bar to be included (SQLite is included in Windows because it is a dependency, not just as a convenience to developers).

Anyway, proposal withdrawn.

Replaced with possible proposal to have distutils include the C++
runtime dll like it does now for the C one.

The big difference here is that msvcp140.dll contains significant functionality while vcruntime140.dll is a very small amount of shared state and initialization. Changes/additions/fixes to msvcp140.dll are far more likely as a result.

I don't recall whether pip extensions are a thing yet, but if they are this would be a great candidate for that (trigger the runtime installer if necessary). Otherwise, having a package that only includes this DLL would probably be fine too, though it really only defers the problem to the next DLL you depend on.

Cheers,
Steve


_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to