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

Error on creation of wheel with a name that already exists, and add Py_LIMITED_API to the docs' FAQ #569

Closed
wants to merge 8 commits into from

Conversation

YannickJadoul
Copy link
Member

@YannickJadoul YannickJadoul commented Jan 30, 2021

Closes #78, by providing clear error messages and documentation on how to use cibuildwheel to create wheels with Python's limited API/stable ABI.

TODO:

  • Show error on copying an already existing file to the output directory
  • Update the FAQ with some information about Python's limited API.
  • Add tests (?)

cibuildwheel/linux.py Outdated Show resolved Hide resolved
'please limit your Python selection to a single version when building limited API\n'
'wheels, with CIBW_BUILD.')
log.error(message)
sys.exit(1)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want sys.exit, or an exception? Or downgrade this to just a warning (though Windows will error, anyway?).

And if sys.exit: just 1, or a new/specific error code?

Copy link
Contributor

@henryiii henryiii Jan 31, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How hard would it be to just skip the build here and go directly to tests when a abi3 wheel is already built? It should likely also be an error if tests are empty, as you should not "build" with multiple versions but not test? That would provide the "full support" solution.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've already done the build at this point. To do the 'full support' thing, we'd need to predict the produced wheel name without actually doing the build.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The first time, you just build like normal. Then you could register that you produced a abi3 wheel, and future builds would skip building. For python-requires, you have to read the config, since you don't know what you are allowed to produce. For ABI3, you could just use the technique above and react to the built, rather than trying to compute what will happen first.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True, that should be possible! The main question is how close this is to cibuildwheel's other behavior. Most of the time, you have to explicitly opt-in to things and cibuildwheel won't say "ah, you probably meant ...".

On a more practical note: how would you decide which Python version to build on? I don't fully understand Py_LIMITED_API, but it seems to also include a "minimum version"?

Copy link
Contributor

@henryiii henryiii Jan 31, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how would you decide which Python version to build on?

Via Requires-Python and/or build selectors. cibuildwheel builds the oldest Python selected, and works it's way forward. Say it builds 2.7, normal wheel. 3.5, normal wheel. Then 3.6 is a stable ABI build. From then on, it just tests the existing wheel: 3.7, 3.8, and 3.9 are just tests of the ABI wheel.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would even work if someone had special logic in setup.py for the limited_abi only working after some version of minimum required Python, while any other non-reactive method would not. You don't need to worry about the other direction (yet?), since the limited ABI works on all future Pythons (at least until Python 4).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, OK, that could work, indeed :-)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like this idea, yeah! Avoiding the metadata read would be great.

@@ -217,6 +217,18 @@ def build(options: BuildOptions) -> None:
# clean up test environment
docker.call(['rm', '-rf', venv_dir])

existing_output_files = docker.call(['ls'], cwd=container_output_dir).split('\n')
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It still feels like there ought to be a better way.

@YannickJadoul
Copy link
Member Author

(@henryiii, if you want to play around, feel free to push things here, btw! I'll be careful with force-pushes, then :-) )

@henryiii
Copy link
Contributor

Force pushes don't bother me, I can always reset. :) I think you got it, though.

@joerick
Copy link
Contributor

joerick commented Jan 31, 2021

Cool. This is a good, pragmatic improvement on the situation in #78.

I wouldn't consider this the ultimate support (maybe it doesn't close #78 exactly), ideally, I think that a project that sets py-limited-api shouldn't need any extra options to be set in cibuildwheel to work. And changing an existing project to use py-limited-api shouldn't have downsides re. testing coverage.

But, those are theoretical 'some-day' desires, I'd still be +1 on merging this - more docs, better error messages, and the py-limited-api test coverage are great improvements!

@YannickJadoul
Copy link
Member Author

@joerick, yes, I had overlooked the issue with testing on different platforms, as mentioned by @mayeut (#78 (comment)). That might be a reason to come up with something, as I don't see a way to do this in cibuildwheel currently.

At the same time, to me, setting just a single Python version in CIBW_BUILD doesn't seem to be a major issue: 1) py_limited_api isn't just set to True, but to a minimum Python version, and 2) as @henryiii clarified, you need to choose a Python version to build on anyway. So CIBW_BUILD makes sense from this perspective. Just not from the testing perspective :-/

@YannickJadoul
Copy link
Member Author

Does anyone have any idea what CircleCI is up to now?

@henryiii
Copy link
Contributor

henryiii commented Feb 2, 2021

For some reason it seems to think there's already a wheel there? Maybe if you had a printout of the contents of the directory on failure, you could see what it was complaining about. ;)

@henryiii
Copy link
Contributor

henryiii commented Feb 2, 2021

Actually, it's the reverse problem (not seeing a wheel that was supposed to be there), but the statement still stands. :)

@YannickJadoul
Copy link
Member Author

YannickJadoul commented Feb 2, 2021

For some reason it seems to think there's already a wheel there? Maybe if you had a printout of the contents of the directory on failure, you could see what it was complaining about. ;)

No, it's the one where I try to get a failure, that's not working. If only pytest would decently print out the mismatch.

@henryiii
Copy link
Contributor

henryiii commented Feb 2, 2021

I often add a print statement since pytest's mismatch / contains printing is terrible.

@YannickJadoul
Copy link
Member Author

Let's try with -vv

@YannickJadoul
Copy link
Member Author

In general, how do we want to continue with this? Do I write some docs and we get this in, and do the other thing (checking abi in the filename and skipping builds) in another PR, or do we build further in this PR?

@YannickJadoul
Copy link
Member Author

I often add a print statement since pytest's mismatch / contains printing is terrible.

Good call!

So, output was written to stdout instead of standard error!? Why were the other platforms OK??

Also, all had had needed to do would have been rebasing, apparently :-( Because dbb6d80

@YannickJadoul
Copy link
Member Author

Nvm AppVeyor failing:

Unable to find image 'pypywheels/manylinux2010-pypy_x86_64:2020-12-11-f1e0e80' locally
Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

Cfr. pypy/manylinux#15

@joerick
Copy link
Contributor

joerick commented Feb 3, 2021

In general, how do we want to continue with this? Do I write some docs and we get this in, and do the other thing (checking abi in the filename and skipping builds) in another PR, or do we build further in this PR?

Entirely up to you - if you're interested in implementing the full 'checking abi in the filename and skipping builds' approach, I think that would be a better solution long-term, and perhaps easier to document too. (Also, it would be slightly better to release limited-api support once, rather than release it and then revise it in the next release, due to the config change.)

But if that seems like a lot of work right now, I'm also happy to merge the interim solution and punt full support down the road.


An aside, that occurred to me - it feels like the natural way to implement the 'full solution' above is to have a function like

is_compatible_wheel(wheel_name: str, python_identifier: str) -> bool 

that would return true for something like

is_compatible_wheel(
    wheel_name='spam-0.1.0-cp35-abi3-manylinux2010_x86_64.whl',
    python_identifier='cp38-manylinux_x86_64'
)

Interesting to think that this might change our policy on non-platform wheels - after all, the result of

is_compatible_wheel(
    wheel_name='spam-0.1.0-py3-none-any.whl',
    python_identifier='cp38-manylinux_x86_64'
)

is True. So if we built the above for limited-api, the result of running cibuildwheel on a pure-python project would be that it would build a pure wheel just once, and skip the rest of the builds. But if a TEST_COMMAND was defined, it would run the tests on all the Pythons. Maybe not what we want to do as a matter of policy, but kinda neat anyway!

@YannickJadoul
Copy link
Member Author

I kind of like that idea, yes! But at the same time, I'm very much not going to implement this is_compatible_wheel. Doesn't wheel or pip have it? At the very least, we should then depend on wheel.pep425tags.get_supported(), no?

@YannickJadoul
Copy link
Member Author

I kind of like that idea, yes! But at the same time, I'm very much not going to implement this is_compatible_wheel. Doesn't wheel or pip have it? At the very least, we should then depend on wheel.pep425tags.get_supported(), no?

Oh, probably this: https://packaging.pypa.io/en/latest/tags.html

@joerick
Copy link
Contributor

joerick commented Feb 3, 2021

Yeah, hopefully that would work? Ideally we could get the list of supported tags in the host process, without downloading the Python distribution first

@mattip
Copy link
Contributor

mattip commented Feb 3, 2021

from packaging import tags
>>> t = tags.Tag('py3', 'none', 'any')
>>> t in tags.sys_tags()
True

@joerick
Copy link
Contributor

joerick commented Feb 3, 2021

Looking at the source, we probably would need to run it in the target Python. So perhaps it would be more like is_compatible_wheel(wheel_name: str, env: dict) -> bool

@YannickJadoul
Copy link
Member Author

Looking at the source, we probably would need to run it in the target Python. So perhaps it would be more like is_compatible_wheel(wheel_name: str, env: dict) -> bool

Hmmm, good point. And it needs to be run inside Docker. What about adding a short script that takes a directory, gets copied into Docker on Linux, and gets run on the guest Python?

@YannickJadoul
Copy link
Member Author

Together with @mattip's fragment (thanks, @mattip!), parse_wheel_filename seems very useful, though :-)

@henryiii
Copy link
Contributor

henryiii commented Feb 3, 2021

Make sure you bump the deps to 20.9 if you use parse_wheel_filename. :)

@joerick
Copy link
Contributor

joerick commented Feb 5, 2021

Hmmm, good point. And it needs to be run inside Docker. What about adding a short script that takes a directory, gets copied into Docker on Linux, and gets run on the guest Python?

Or even passing a little script with -c?

python -c 'import packaging.tags, json, sys; json.dump([str(t) for t in packaging.tags.sys_tags()], sys.stdout)'

produces:

[
  "cp38-cp38-macosx_10_16_x86_64",
  "cp38-cp38-macosx_10_16_intel",
  "cp38-cp38-macosx_10_16_fat64",
  "cp38-cp38-macosx_10_16_fat32",
  "cp38-cp38-macosx_10_16_universal2",
  "cp38-cp38-macosx_10_16_universal",
  "cp38-cp38-macosx_10_15_x86_64",
  "cp38-cp38-macosx_10_15_intel",
  "cp38-cp38-macosx_10_15_fat64",
  "cp38-cp38-macosx_10_15_fat32",
  "cp38-cp38-macosx_10_15_universal2",
  "cp38-cp38-macosx_10_15_universal",
  "cp38-cp38-macosx_10_14_x86_64",
  "cp38-cp38-macosx_10_14_intel",
  "cp38-cp38-macosx_10_14_fat64",
  "cp38-cp38-macosx_10_14_fat32",
  "cp38-cp38-macosx_10_14_universal2",
  "cp38-cp38-macosx_10_14_universal",
  "cp38-cp38-macosx_10_13_x86_64",
  "cp38-cp38-macosx_10_13_intel",
  "cp38-cp38-macosx_10_13_fat64",
  "cp38-cp38-macosx_10_13_fat32",
  "cp38-cp38-macosx_10_13_universal2",
  "cp38-cp38-macosx_10_13_universal",
  "cp38-cp38-macosx_10_12_x86_64",
  "cp38-cp38-macosx_10_12_intel",
  "cp38-cp38-macosx_10_12_fat64",
  "cp38-cp38-macosx_10_12_fat32",
  "cp38-cp38-macosx_10_12_universal2",
  "cp38-cp38-macosx_10_12_universal",
  "cp38-cp38-macosx_10_11_x86_64",
  "cp38-cp38-macosx_10_11_intel",
  "cp38-cp38-macosx_10_11_fat64",
  "cp38-cp38-macosx_10_11_fat32",
  "cp38-cp38-macosx_10_11_universal2",
  "cp38-cp38-macosx_10_11_universal",
  "cp38-cp38-macosx_10_10_x86_64",
  "cp38-cp38-macosx_10_10_intel",
  "cp38-cp38-macosx_10_10_fat64",
  "cp38-cp38-macosx_10_10_fat32",
  "cp38-cp38-macosx_10_10_universal2",
  "cp38-cp38-macosx_10_10_universal",
  "cp38-cp38-macosx_10_9_x86_64",
  "cp38-cp38-macosx_10_9_intel",
  "cp38-cp38-macosx_10_9_fat64",
  "cp38-cp38-macosx_10_9_fat32",
  "cp38-cp38-macosx_10_9_universal2",
  "cp38-cp38-macosx_10_9_universal",
  "cp38-cp38-macosx_10_8_x86_64",
  "cp38-cp38-macosx_10_8_intel",
  "cp38-cp38-macosx_10_8_fat64",
  "cp38-cp38-macosx_10_8_fat32",
  "cp38-cp38-macosx_10_8_universal2",
  "cp38-cp38-macosx_10_8_universal",
  "cp38-cp38-macosx_10_7_x86_64",
  "cp38-cp38-macosx_10_7_intel",
  "cp38-cp38-macosx_10_7_fat64",
  "cp38-cp38-macosx_10_7_fat32",
  "cp38-cp38-macosx_10_7_universal2",
  "cp38-cp38-macosx_10_7_universal",
  "cp38-cp38-macosx_10_6_x86_64",
  "cp38-cp38-macosx_10_6_intel",
  "cp38-cp38-macosx_10_6_fat64",
  "cp38-cp38-macosx_10_6_fat32",
  "cp38-cp38-macosx_10_6_universal2",
  "cp38-cp38-macosx_10_6_universal",
  "cp38-cp38-macosx_10_5_x86_64",
  "cp38-cp38-macosx_10_5_intel",
  "cp38-cp38-macosx_10_5_fat64",
  "cp38-cp38-macosx_10_5_fat32",
  "cp38-cp38-macosx_10_5_universal2",
  "cp38-cp38-macosx_10_5_universal",
  "cp38-cp38-macosx_10_4_x86_64",
  "cp38-cp38-macosx_10_4_intel",
  "cp38-cp38-macosx_10_4_fat64",
  "cp38-cp38-macosx_10_4_fat32",
  "cp38-cp38-macosx_10_4_universal2",
  "cp38-cp38-macosx_10_4_universal",
  "cp38-abi3-macosx_10_16_x86_64",
  "cp38-abi3-macosx_10_16_intel",
  "cp38-abi3-macosx_10_16_fat64",
  "cp38-abi3-macosx_10_16_fat32",
  "cp38-abi3-macosx_10_16_universal2",
  "cp38-abi3-macosx_10_16_universal",
  "cp38-abi3-macosx_10_15_x86_64",
  "cp38-abi3-macosx_10_15_intel",
  "cp38-abi3-macosx_10_15_fat64",
  "cp38-abi3-macosx_10_15_fat32",
  "cp38-abi3-macosx_10_15_universal2",
  "cp38-abi3-macosx_10_15_universal",
  "cp38-abi3-macosx_10_14_x86_64",
  "cp38-abi3-macosx_10_14_intel",
  "cp38-abi3-macosx_10_14_fat64",
  "cp38-abi3-macosx_10_14_fat32",
  "cp38-abi3-macosx_10_14_universal2",
  "cp38-abi3-macosx_10_14_universal",
  "cp38-abi3-macosx_10_13_x86_64",
  "cp38-abi3-macosx_10_13_intel",
  "cp38-abi3-macosx_10_13_fat64",
  "cp38-abi3-macosx_10_13_fat32",
  "cp38-abi3-macosx_10_13_universal2",
  "cp38-abi3-macosx_10_13_universal",
  "cp38-abi3-macosx_10_12_x86_64",
  "cp38-abi3-macosx_10_12_intel",
  "cp38-abi3-macosx_10_12_fat64",
  "cp38-abi3-macosx_10_12_fat32",
  "cp38-abi3-macosx_10_12_universal2",
  "cp38-abi3-macosx_10_12_universal",
  "cp38-abi3-macosx_10_11_x86_64",
  "cp38-abi3-macosx_10_11_intel",
  "cp38-abi3-macosx_10_11_fat64",
  "cp38-abi3-macosx_10_11_fat32",
  "cp38-abi3-macosx_10_11_universal2",
  "cp38-abi3-macosx_10_11_universal",
  "cp38-abi3-macosx_10_10_x86_64",
  "cp38-abi3-macosx_10_10_intel",
  "cp38-abi3-macosx_10_10_fat64",
  "cp38-abi3-macosx_10_10_fat32",
  "cp38-abi3-macosx_10_10_universal2",
  "cp38-abi3-macosx_10_10_universal",
  "cp38-abi3-macosx_10_9_x86_64",
  "cp38-abi3-macosx_10_9_intel",
  "cp38-abi3-macosx_10_9_fat64",
  "cp38-abi3-macosx_10_9_fat32",
  "cp38-abi3-macosx_10_9_universal2",
  "cp38-abi3-macosx_10_9_universal",
  "cp38-abi3-macosx_10_8_x86_64",
  "cp38-abi3-macosx_10_8_intel",
  "cp38-abi3-macosx_10_8_fat64",
  "cp38-abi3-macosx_10_8_fat32",
  "cp38-abi3-macosx_10_8_universal2",
  "cp38-abi3-macosx_10_8_universal",
  "cp38-abi3-macosx_10_7_x86_64",
  "cp38-abi3-macosx_10_7_intel",
  "cp38-abi3-macosx_10_7_fat64",
  "cp38-abi3-macosx_10_7_fat32",
  "cp38-abi3-macosx_10_7_universal2",
  "cp38-abi3-macosx_10_7_universal",
  "cp38-abi3-macosx_10_6_x86_64",
  "cp38-abi3-macosx_10_6_intel",
  "cp38-abi3-macosx_10_6_fat64",
  "cp38-abi3-macosx_10_6_fat32",
  "cp38-abi3-macosx_10_6_universal2",
  "cp38-abi3-macosx_10_6_universal",
  "cp38-abi3-macosx_10_5_x86_64",
  "cp38-abi3-macosx_10_5_intel",
  "cp38-abi3-macosx_10_5_fat64",
  "cp38-abi3-macosx_10_5_fat32",
  "cp38-abi3-macosx_10_5_universal2",
  "cp38-abi3-macosx_10_5_universal",
  "cp38-abi3-macosx_10_4_x86_64",
  "cp38-abi3-macosx_10_4_intel",
  "cp38-abi3-macosx_10_4_fat64",
  "cp38-abi3-macosx_10_4_fat32",
  "cp38-abi3-macosx_10_4_universal2",
  "cp38-abi3-macosx_10_4_universal",
  "cp38-none-macosx_10_16_x86_64",
  "cp38-none-macosx_10_16_intel",
  "cp38-none-macosx_10_16_fat64",
  "cp38-none-macosx_10_16_fat32",
  "cp38-none-macosx_10_16_universal2",
  "cp38-none-macosx_10_16_universal",
  "cp38-none-macosx_10_15_x86_64",
  "cp38-none-macosx_10_15_intel",
  "cp38-none-macosx_10_15_fat64",
  "cp38-none-macosx_10_15_fat32",
  "cp38-none-macosx_10_15_universal2",
  "cp38-none-macosx_10_15_universal",
  "cp38-none-macosx_10_14_x86_64",
  "cp38-none-macosx_10_14_intel",
  "cp38-none-macosx_10_14_fat64",
  "cp38-none-macosx_10_14_fat32",
  "cp38-none-macosx_10_14_universal2",
  "cp38-none-macosx_10_14_universal",
  "cp38-none-macosx_10_13_x86_64",
  "cp38-none-macosx_10_13_intel",
  "cp38-none-macosx_10_13_fat64",
  "cp38-none-macosx_10_13_fat32",
  "cp38-none-macosx_10_13_universal2",
  "cp38-none-macosx_10_13_universal",
  "cp38-none-macosx_10_12_x86_64",
  "cp38-none-macosx_10_12_intel",
  "cp38-none-macosx_10_12_fat64",
  "cp38-none-macosx_10_12_fat32",
  "cp38-none-macosx_10_12_universal2",
  "cp38-none-macosx_10_12_universal",
  "cp38-none-macosx_10_11_x86_64",
  "cp38-none-macosx_10_11_intel",
  "cp38-none-macosx_10_11_fat64",
  "cp38-none-macosx_10_11_fat32",
  "cp38-none-macosx_10_11_universal2",
  "cp38-none-macosx_10_11_universal",
  "cp38-none-macosx_10_10_x86_64",
  "cp38-none-macosx_10_10_intel",
  "cp38-none-macosx_10_10_fat64",
  "cp38-none-macosx_10_10_fat32",
  "cp38-none-macosx_10_10_universal2",
  "cp38-none-macosx_10_10_universal",
  "cp38-none-macosx_10_9_x86_64",
  "cp38-none-macosx_10_9_intel",
  "cp38-none-macosx_10_9_fat64",
  "cp38-none-macosx_10_9_fat32",
  "cp38-none-macosx_10_9_universal2",
  "cp38-none-macosx_10_9_universal",
  "cp38-none-macosx_10_8_x86_64",
  "cp38-none-macosx_10_8_intel",
  "cp38-none-macosx_10_8_fat64",
  "cp38-none-macosx_10_8_fat32",
  "cp38-none-macosx_10_8_universal2",
  "cp38-none-macosx_10_8_universal",
  "cp38-none-macosx_10_7_x86_64",
  "cp38-none-macosx_10_7_intel",
  "cp38-none-macosx_10_7_fat64",
  "cp38-none-macosx_10_7_fat32",
  "cp38-none-macosx_10_7_universal2",
  "cp38-none-macosx_10_7_universal",
  "cp38-none-macosx_10_6_x86_64",
  "cp38-none-macosx_10_6_intel",
  "cp38-none-macosx_10_6_fat64",
  "cp38-none-macosx_10_6_fat32",
  "cp38-none-macosx_10_6_universal2",
  "cp38-none-macosx_10_6_universal",
  "cp38-none-macosx_10_5_x86_64",
  "cp38-none-macosx_10_5_intel",
  "cp38-none-macosx_10_5_fat64",
  "cp38-none-macosx_10_5_fat32",
  "cp38-none-macosx_10_5_universal2",
  "cp38-none-macosx_10_5_universal",
  "cp38-none-macosx_10_4_x86_64",
  "cp38-none-macosx_10_4_intel",
  "cp38-none-macosx_10_4_fat64",
  "cp38-none-macosx_10_4_fat32",
  "cp38-none-macosx_10_4_universal2",
  "cp38-none-macosx_10_4_universal",
  "cp37-abi3-macosx_10_16_x86_64",
  "cp37-abi3-macosx_10_16_intel",
  "cp37-abi3-macosx_10_16_fat64",
  "cp37-abi3-macosx_10_16_fat32",
  "cp37-abi3-macosx_10_16_universal2",
  "cp37-abi3-macosx_10_16_universal",
  "cp37-abi3-macosx_10_15_x86_64",
  "cp37-abi3-macosx_10_15_intel",
  "cp37-abi3-macosx_10_15_fat64",
  "cp37-abi3-macosx_10_15_fat32",
  "cp37-abi3-macosx_10_15_universal2",
  "cp37-abi3-macosx_10_15_universal",
  "cp37-abi3-macosx_10_14_x86_64",
  "cp37-abi3-macosx_10_14_intel",
  "cp37-abi3-macosx_10_14_fat64",
  "cp37-abi3-macosx_10_14_fat32",
  "cp37-abi3-macosx_10_14_universal2",
  "cp37-abi3-macosx_10_14_universal",
  "cp37-abi3-macosx_10_13_x86_64",
  "cp37-abi3-macosx_10_13_intel",
  "cp37-abi3-macosx_10_13_fat64",
  "cp37-abi3-macosx_10_13_fat32",
  "cp37-abi3-macosx_10_13_universal2",
  "cp37-abi3-macosx_10_13_universal",
  "cp37-abi3-macosx_10_12_x86_64",
  "cp37-abi3-macosx_10_12_intel",
  "cp37-abi3-macosx_10_12_fat64",
  "cp37-abi3-macosx_10_12_fat32",
  "cp37-abi3-macosx_10_12_universal2",
  "cp37-abi3-macosx_10_12_universal",
  "cp37-abi3-macosx_10_11_x86_64",
  "cp37-abi3-macosx_10_11_intel",
  "cp37-abi3-macosx_10_11_fat64",
  "cp37-abi3-macosx_10_11_fat32",
  "cp37-abi3-macosx_10_11_universal2",
  "cp37-abi3-macosx_10_11_universal",
  "cp37-abi3-macosx_10_10_x86_64",
  "cp37-abi3-macosx_10_10_intel",
  "cp37-abi3-macosx_10_10_fat64",
  "cp37-abi3-macosx_10_10_fat32",
  "cp37-abi3-macosx_10_10_universal2",
  "cp37-abi3-macosx_10_10_universal",
  "cp37-abi3-macosx_10_9_x86_64",
  "cp37-abi3-macosx_10_9_intel",
  "cp37-abi3-macosx_10_9_fat64",
  "cp37-abi3-macosx_10_9_fat32",
  "cp37-abi3-macosx_10_9_universal2",
  "cp37-abi3-macosx_10_9_universal",
  "cp37-abi3-macosx_10_8_x86_64",
  "cp37-abi3-macosx_10_8_intel",
  "cp37-abi3-macosx_10_8_fat64",
  "cp37-abi3-macosx_10_8_fat32",
  "cp37-abi3-macosx_10_8_universal2",
  "cp37-abi3-macosx_10_8_universal",
  "cp37-abi3-macosx_10_7_x86_64",
  "cp37-abi3-macosx_10_7_intel",
  "cp37-abi3-macosx_10_7_fat64",
  "cp37-abi3-macosx_10_7_fat32",
  "cp37-abi3-macosx_10_7_universal2",
  "cp37-abi3-macosx_10_7_universal",
  "cp37-abi3-macosx_10_6_x86_64",
  "cp37-abi3-macosx_10_6_intel",
  "cp37-abi3-macosx_10_6_fat64",
  "cp37-abi3-macosx_10_6_fat32",
  "cp37-abi3-macosx_10_6_universal2",
  "cp37-abi3-macosx_10_6_universal",
  "cp37-abi3-macosx_10_5_x86_64",
  "cp37-abi3-macosx_10_5_intel",
  "cp37-abi3-macosx_10_5_fat64",
  "cp37-abi3-macosx_10_5_fat32",
  "cp37-abi3-macosx_10_5_universal2",
  "cp37-abi3-macosx_10_5_universal",
  "cp37-abi3-macosx_10_4_x86_64",
  "cp37-abi3-macosx_10_4_intel",
  "cp37-abi3-macosx_10_4_fat64",
  "cp37-abi3-macosx_10_4_fat32",
  "cp37-abi3-macosx_10_4_universal2",
  "cp37-abi3-macosx_10_4_universal",
  "cp36-abi3-macosx_10_16_x86_64",
  "cp36-abi3-macosx_10_16_intel",
  "cp36-abi3-macosx_10_16_fat64",
  "cp36-abi3-macosx_10_16_fat32",
  "cp36-abi3-macosx_10_16_universal2",
  "cp36-abi3-macosx_10_16_universal",
  "cp36-abi3-macosx_10_15_x86_64",
  "cp36-abi3-macosx_10_15_intel",
  "cp36-abi3-macosx_10_15_fat64",
  "cp36-abi3-macosx_10_15_fat32",
  "cp36-abi3-macosx_10_15_universal2",
  "cp36-abi3-macosx_10_15_universal",
  "cp36-abi3-macosx_10_14_x86_64",
  "cp36-abi3-macosx_10_14_intel",
  "cp36-abi3-macosx_10_14_fat64",
  "cp36-abi3-macosx_10_14_fat32",
  "cp36-abi3-macosx_10_14_universal2",
  "cp36-abi3-macosx_10_14_universal",
  "cp36-abi3-macosx_10_13_x86_64",
  "cp36-abi3-macosx_10_13_intel",
  "cp36-abi3-macosx_10_13_fat64",
  "cp36-abi3-macosx_10_13_fat32",
  "cp36-abi3-macosx_10_13_universal2",
  "cp36-abi3-macosx_10_13_universal",
  "cp36-abi3-macosx_10_12_x86_64",
  "cp36-abi3-macosx_10_12_intel",
  "cp36-abi3-macosx_10_12_fat64",
  "cp36-abi3-macosx_10_12_fat32",
  "cp36-abi3-macosx_10_12_universal2",
  "cp36-abi3-macosx_10_12_universal",
  "cp36-abi3-macosx_10_11_x86_64",
  "cp36-abi3-macosx_10_11_intel",
  "cp36-abi3-macosx_10_11_fat64",
  "cp36-abi3-macosx_10_11_fat32",
  "cp36-abi3-macosx_10_11_universal2",
  "cp36-abi3-macosx_10_11_universal",
  "cp36-abi3-macosx_10_10_x86_64",
  "cp36-abi3-macosx_10_10_intel",
  "cp36-abi3-macosx_10_10_fat64",
  "cp36-abi3-macosx_10_10_fat32",
  "cp36-abi3-macosx_10_10_universal2",
  "cp36-abi3-macosx_10_10_universal",
  "cp36-abi3-macosx_10_9_x86_64",
  "cp36-abi3-macosx_10_9_intel",
  "cp36-abi3-macosx_10_9_fat64",
  "cp36-abi3-macosx_10_9_fat32",
  "cp36-abi3-macosx_10_9_universal2",
  "cp36-abi3-macosx_10_9_universal",
  "cp36-abi3-macosx_10_8_x86_64",
  "cp36-abi3-macosx_10_8_intel",
  "cp36-abi3-macosx_10_8_fat64",
  "cp36-abi3-macosx_10_8_fat32",
  "cp36-abi3-macosx_10_8_universal2",
  "cp36-abi3-macosx_10_8_universal",
  "cp36-abi3-macosx_10_7_x86_64",
  "cp36-abi3-macosx_10_7_intel",
  "cp36-abi3-macosx_10_7_fat64",
  "cp36-abi3-macosx_10_7_fat32",
  "cp36-abi3-macosx_10_7_universal2",
  "cp36-abi3-macosx_10_7_universal",
  "cp36-abi3-macosx_10_6_x86_64",
  "cp36-abi3-macosx_10_6_intel",
  "cp36-abi3-macosx_10_6_fat64",
  "cp36-abi3-macosx_10_6_fat32",
  "cp36-abi3-macosx_10_6_universal2",
  "cp36-abi3-macosx_10_6_universal",
  "cp36-abi3-macosx_10_5_x86_64",
  "cp36-abi3-macosx_10_5_intel",
  "cp36-abi3-macosx_10_5_fat64",
  "cp36-abi3-macosx_10_5_fat32",
  "cp36-abi3-macosx_10_5_universal2",
  "cp36-abi3-macosx_10_5_universal",
  "cp36-abi3-macosx_10_4_x86_64",
  "cp36-abi3-macosx_10_4_intel",
  "cp36-abi3-macosx_10_4_fat64",
  "cp36-abi3-macosx_10_4_fat32",
  "cp36-abi3-macosx_10_4_universal2",
  "cp36-abi3-macosx_10_4_universal",
  "cp35-abi3-macosx_10_16_x86_64",
  "cp35-abi3-macosx_10_16_intel",
  "cp35-abi3-macosx_10_16_fat64",
  "cp35-abi3-macosx_10_16_fat32",
  "cp35-abi3-macosx_10_16_universal2",
  "cp35-abi3-macosx_10_16_universal",
  "cp35-abi3-macosx_10_15_x86_64",
  "cp35-abi3-macosx_10_15_intel",
  "cp35-abi3-macosx_10_15_fat64",
  "cp35-abi3-macosx_10_15_fat32",
  "cp35-abi3-macosx_10_15_universal2",
  "cp35-abi3-macosx_10_15_universal",
  "cp35-abi3-macosx_10_14_x86_64",
  "cp35-abi3-macosx_10_14_intel",
  "cp35-abi3-macosx_10_14_fat64",
  "cp35-abi3-macosx_10_14_fat32",
  "cp35-abi3-macosx_10_14_universal2",
  "cp35-abi3-macosx_10_14_universal",
  "cp35-abi3-macosx_10_13_x86_64",
  "cp35-abi3-macosx_10_13_intel",
  "cp35-abi3-macosx_10_13_fat64",
  "cp35-abi3-macosx_10_13_fat32",
  "cp35-abi3-macosx_10_13_universal2",
  "cp35-abi3-macosx_10_13_universal",
  "cp35-abi3-macosx_10_12_x86_64",
  "cp35-abi3-macosx_10_12_intel",
  "cp35-abi3-macosx_10_12_fat64",
  "cp35-abi3-macosx_10_12_fat32",
  "cp35-abi3-macosx_10_12_universal2",
  "cp35-abi3-macosx_10_12_universal",
  "cp35-abi3-macosx_10_11_x86_64",
  "cp35-abi3-macosx_10_11_intel",
  "cp35-abi3-macosx_10_11_fat64",
  "cp35-abi3-macosx_10_11_fat32",
  "cp35-abi3-macosx_10_11_universal2",
  "cp35-abi3-macosx_10_11_universal",
  "cp35-abi3-macosx_10_10_x86_64",
  "cp35-abi3-macosx_10_10_intel",
  "cp35-abi3-macosx_10_10_fat64",
  "cp35-abi3-macosx_10_10_fat32",
  "cp35-abi3-macosx_10_10_universal2",
  "cp35-abi3-macosx_10_10_universal",
  "cp35-abi3-macosx_10_9_x86_64",
  "cp35-abi3-macosx_10_9_intel",
  "cp35-abi3-macosx_10_9_fat64",
  "cp35-abi3-macosx_10_9_fat32",
  "cp35-abi3-macosx_10_9_universal2",
  "cp35-abi3-macosx_10_9_universal",
  "cp35-abi3-macosx_10_8_x86_64",
  "cp35-abi3-macosx_10_8_intel",
  "cp35-abi3-macosx_10_8_fat64",
  "cp35-abi3-macosx_10_8_fat32",
  "cp35-abi3-macosx_10_8_universal2",
  "cp35-abi3-macosx_10_8_universal",
  "cp35-abi3-macosx_10_7_x86_64",
  "cp35-abi3-macosx_10_7_intel",
  "cp35-abi3-macosx_10_7_fat64",
  "cp35-abi3-macosx_10_7_fat32",
  "cp35-abi3-macosx_10_7_universal2",
  "cp35-abi3-macosx_10_7_universal",
  "cp35-abi3-macosx_10_6_x86_64",
  "cp35-abi3-macosx_10_6_intel",
  "cp35-abi3-macosx_10_6_fat64",
  "cp35-abi3-macosx_10_6_fat32",
  "cp35-abi3-macosx_10_6_universal2",
  "cp35-abi3-macosx_10_6_universal",
  "cp35-abi3-macosx_10_5_x86_64",
  "cp35-abi3-macosx_10_5_intel",
  "cp35-abi3-macosx_10_5_fat64",
  "cp35-abi3-macosx_10_5_fat32",
  "cp35-abi3-macosx_10_5_universal2",
  "cp35-abi3-macosx_10_5_universal",
  "cp35-abi3-macosx_10_4_x86_64",
  "cp35-abi3-macosx_10_4_intel",
  "cp35-abi3-macosx_10_4_fat64",
  "cp35-abi3-macosx_10_4_fat32",
  "cp35-abi3-macosx_10_4_universal2",
  "cp35-abi3-macosx_10_4_universal",
  "cp34-abi3-macosx_10_16_x86_64",
  "cp34-abi3-macosx_10_16_intel",
  "cp34-abi3-macosx_10_16_fat64",
  "cp34-abi3-macosx_10_16_fat32",
  "cp34-abi3-macosx_10_16_universal2",
  "cp34-abi3-macosx_10_16_universal",
  "cp34-abi3-macosx_10_15_x86_64",
  "cp34-abi3-macosx_10_15_intel",
  "cp34-abi3-macosx_10_15_fat64",
  "cp34-abi3-macosx_10_15_fat32",
  "cp34-abi3-macosx_10_15_universal2",
  "cp34-abi3-macosx_10_15_universal",
  "cp34-abi3-macosx_10_14_x86_64",
  "cp34-abi3-macosx_10_14_intel",
  "cp34-abi3-macosx_10_14_fat64",
  "cp34-abi3-macosx_10_14_fat32",
  "cp34-abi3-macosx_10_14_universal2",
  "cp34-abi3-macosx_10_14_universal",
  "cp34-abi3-macosx_10_13_x86_64",
  "cp34-abi3-macosx_10_13_intel",
  "cp34-abi3-macosx_10_13_fat64",
  "cp34-abi3-macosx_10_13_fat32",
  "cp34-abi3-macosx_10_13_universal2",
  "cp34-abi3-macosx_10_13_universal",
  "cp34-abi3-macosx_10_12_x86_64",
  "cp34-abi3-macosx_10_12_intel",
  "cp34-abi3-macosx_10_12_fat64",
  "cp34-abi3-macosx_10_12_fat32",
  "cp34-abi3-macosx_10_12_universal2",
  "cp34-abi3-macosx_10_12_universal",
  "cp34-abi3-macosx_10_11_x86_64",
  "cp34-abi3-macosx_10_11_intel",
  "cp34-abi3-macosx_10_11_fat64",
  "cp34-abi3-macosx_10_11_fat32",
  "cp34-abi3-macosx_10_11_universal2",
  "cp34-abi3-macosx_10_11_universal",
  "cp34-abi3-macosx_10_10_x86_64",
  "cp34-abi3-macosx_10_10_intel",
  "cp34-abi3-macosx_10_10_fat64",
  "cp34-abi3-macosx_10_10_fat32",
  "cp34-abi3-macosx_10_10_universal2",
  "cp34-abi3-macosx_10_10_universal",
  "cp34-abi3-macosx_10_9_x86_64",
  "cp34-abi3-macosx_10_9_intel",
  "cp34-abi3-macosx_10_9_fat64",
  "cp34-abi3-macosx_10_9_fat32",
  "cp34-abi3-macosx_10_9_universal2",
  "cp34-abi3-macosx_10_9_universal",
  "cp34-abi3-macosx_10_8_x86_64",
  "cp34-abi3-macosx_10_8_intel",
  "cp34-abi3-macosx_10_8_fat64",
  "cp34-abi3-macosx_10_8_fat32",
  "cp34-abi3-macosx_10_8_universal2",
  "cp34-abi3-macosx_10_8_universal",
  "cp34-abi3-macosx_10_7_x86_64",
  "cp34-abi3-macosx_10_7_intel",
  "cp34-abi3-macosx_10_7_fat64",
  "cp34-abi3-macosx_10_7_fat32",
  "cp34-abi3-macosx_10_7_universal2",
  "cp34-abi3-macosx_10_7_universal",
  "cp34-abi3-macosx_10_6_x86_64",
  "cp34-abi3-macosx_10_6_intel",
  "cp34-abi3-macosx_10_6_fat64",
  "cp34-abi3-macosx_10_6_fat32",
  "cp34-abi3-macosx_10_6_universal2",
  "cp34-abi3-macosx_10_6_universal",
  "cp34-abi3-macosx_10_5_x86_64",
  "cp34-abi3-macosx_10_5_intel",
  "cp34-abi3-macosx_10_5_fat64",
  "cp34-abi3-macosx_10_5_fat32",
  "cp34-abi3-macosx_10_5_universal2",
  "cp34-abi3-macosx_10_5_universal",
  "cp34-abi3-macosx_10_4_x86_64",
  "cp34-abi3-macosx_10_4_intel",
  "cp34-abi3-macosx_10_4_fat64",
  "cp34-abi3-macosx_10_4_fat32",
  "cp34-abi3-macosx_10_4_universal2",
  "cp34-abi3-macosx_10_4_universal",
  "cp33-abi3-macosx_10_16_x86_64",
  "cp33-abi3-macosx_10_16_intel",
  "cp33-abi3-macosx_10_16_fat64",
  "cp33-abi3-macosx_10_16_fat32",
  "cp33-abi3-macosx_10_16_universal2",
  "cp33-abi3-macosx_10_16_universal",
  "cp33-abi3-macosx_10_15_x86_64",
  "cp33-abi3-macosx_10_15_intel",
  "cp33-abi3-macosx_10_15_fat64",
  "cp33-abi3-macosx_10_15_fat32",
  "cp33-abi3-macosx_10_15_universal2",
  "cp33-abi3-macosx_10_15_universal",
  "cp33-abi3-macosx_10_14_x86_64",
  "cp33-abi3-macosx_10_14_intel",
  "cp33-abi3-macosx_10_14_fat64",
  "cp33-abi3-macosx_10_14_fat32",
  "cp33-abi3-macosx_10_14_universal2",
  "cp33-abi3-macosx_10_14_universal",
  "cp33-abi3-macosx_10_13_x86_64",
  "cp33-abi3-macosx_10_13_intel",
  "cp33-abi3-macosx_10_13_fat64",
  "cp33-abi3-macosx_10_13_fat32",
  "cp33-abi3-macosx_10_13_universal2",
  "cp33-abi3-macosx_10_13_universal",
  "cp33-abi3-macosx_10_12_x86_64",
  "cp33-abi3-macosx_10_12_intel",
  "cp33-abi3-macosx_10_12_fat64",
  "cp33-abi3-macosx_10_12_fat32",
  "cp33-abi3-macosx_10_12_universal2",
  "cp33-abi3-macosx_10_12_universal",
  "cp33-abi3-macosx_10_11_x86_64",
  "cp33-abi3-macosx_10_11_intel",
  "cp33-abi3-macosx_10_11_fat64",
  "cp33-abi3-macosx_10_11_fat32",
  "cp33-abi3-macosx_10_11_universal2",
  "cp33-abi3-macosx_10_11_universal",
  "cp33-abi3-macosx_10_10_x86_64",
  "cp33-abi3-macosx_10_10_intel",
  "cp33-abi3-macosx_10_10_fat64",
  "cp33-abi3-macosx_10_10_fat32",
  "cp33-abi3-macosx_10_10_universal2",
  "cp33-abi3-macosx_10_10_universal",
  "cp33-abi3-macosx_10_9_x86_64",
  "cp33-abi3-macosx_10_9_intel",
  "cp33-abi3-macosx_10_9_fat64",
  "cp33-abi3-macosx_10_9_fat32",
  "cp33-abi3-macosx_10_9_universal2",
  "cp33-abi3-macosx_10_9_universal",
  "cp33-abi3-macosx_10_8_x86_64",
  "cp33-abi3-macosx_10_8_intel",
  "cp33-abi3-macosx_10_8_fat64",
  "cp33-abi3-macosx_10_8_fat32",
  "cp33-abi3-macosx_10_8_universal2",
  "cp33-abi3-macosx_10_8_universal",
  "cp33-abi3-macosx_10_7_x86_64",
  "cp33-abi3-macosx_10_7_intel",
  "cp33-abi3-macosx_10_7_fat64",
  "cp33-abi3-macosx_10_7_fat32",
  "cp33-abi3-macosx_10_7_universal2",
  "cp33-abi3-macosx_10_7_universal",
  "cp33-abi3-macosx_10_6_x86_64",
  "cp33-abi3-macosx_10_6_intel",
  "cp33-abi3-macosx_10_6_fat64",
  "cp33-abi3-macosx_10_6_fat32",
  "cp33-abi3-macosx_10_6_universal2",
  "cp33-abi3-macosx_10_6_universal",
  "cp33-abi3-macosx_10_5_x86_64",
  "cp33-abi3-macosx_10_5_intel",
  "cp33-abi3-macosx_10_5_fat64",
  "cp33-abi3-macosx_10_5_fat32",
  "cp33-abi3-macosx_10_5_universal2",
  "cp33-abi3-macosx_10_5_universal",
  "cp33-abi3-macosx_10_4_x86_64",
  "cp33-abi3-macosx_10_4_intel",
  "cp33-abi3-macosx_10_4_fat64",
  "cp33-abi3-macosx_10_4_fat32",
  "cp33-abi3-macosx_10_4_universal2",
  "cp33-abi3-macosx_10_4_universal",
  "cp32-abi3-macosx_10_16_x86_64",
  "cp32-abi3-macosx_10_16_intel",
  "cp32-abi3-macosx_10_16_fat64",
  "cp32-abi3-macosx_10_16_fat32",
  "cp32-abi3-macosx_10_16_universal2",
  "cp32-abi3-macosx_10_16_universal",
  "cp32-abi3-macosx_10_15_x86_64",
  "cp32-abi3-macosx_10_15_intel",
  "cp32-abi3-macosx_10_15_fat64",
  "cp32-abi3-macosx_10_15_fat32",
  "cp32-abi3-macosx_10_15_universal2",
  "cp32-abi3-macosx_10_15_universal",
  "cp32-abi3-macosx_10_14_x86_64",
  "cp32-abi3-macosx_10_14_intel",
  "cp32-abi3-macosx_10_14_fat64",
  "cp32-abi3-macosx_10_14_fat32",
  "cp32-abi3-macosx_10_14_universal2",
  "cp32-abi3-macosx_10_14_universal",
  "cp32-abi3-macosx_10_13_x86_64",
  "cp32-abi3-macosx_10_13_intel",
  "cp32-abi3-macosx_10_13_fat64",
  "cp32-abi3-macosx_10_13_fat32",
  "cp32-abi3-macosx_10_13_universal2",
  "cp32-abi3-macosx_10_13_universal",
  "cp32-abi3-macosx_10_12_x86_64",
  "cp32-abi3-macosx_10_12_intel",
  "cp32-abi3-macosx_10_12_fat64",
  "cp32-abi3-macosx_10_12_fat32",
  "cp32-abi3-macosx_10_12_universal2",
  "cp32-abi3-macosx_10_12_universal",
  "cp32-abi3-macosx_10_11_x86_64",
  "cp32-abi3-macosx_10_11_intel",
  "cp32-abi3-macosx_10_11_fat64",
  "cp32-abi3-macosx_10_11_fat32",
  "cp32-abi3-macosx_10_11_universal2",
  "cp32-abi3-macosx_10_11_universal",
  "cp32-abi3-macosx_10_10_x86_64",
  "cp32-abi3-macosx_10_10_intel",
  "cp32-abi3-macosx_10_10_fat64",
  "cp32-abi3-macosx_10_10_fat32",
  "cp32-abi3-macosx_10_10_universal2",
  "cp32-abi3-macosx_10_10_universal",
  "cp32-abi3-macosx_10_9_x86_64",
  "cp32-abi3-macosx_10_9_intel",
  "cp32-abi3-macosx_10_9_fat64",
  "cp32-abi3-macosx_10_9_fat32",
  "cp32-abi3-macosx_10_9_universal2",
  "cp32-abi3-macosx_10_9_universal",
  "cp32-abi3-macosx_10_8_x86_64",
  "cp32-abi3-macosx_10_8_intel",
  "cp32-abi3-macosx_10_8_fat64",
  "cp32-abi3-macosx_10_8_fat32",
  "cp32-abi3-macosx_10_8_universal2",
  "cp32-abi3-macosx_10_8_universal",
  "cp32-abi3-macosx_10_7_x86_64",
  "cp32-abi3-macosx_10_7_intel",
  "cp32-abi3-macosx_10_7_fat64",
  "cp32-abi3-macosx_10_7_fat32",
  "cp32-abi3-macosx_10_7_universal2",
  "cp32-abi3-macosx_10_7_universal",
  "cp32-abi3-macosx_10_6_x86_64",
  "cp32-abi3-macosx_10_6_intel",
  "cp32-abi3-macosx_10_6_fat64",
  "cp32-abi3-macosx_10_6_fat32",
  "cp32-abi3-macosx_10_6_universal2",
  "cp32-abi3-macosx_10_6_universal",
  "cp32-abi3-macosx_10_5_x86_64",
  "cp32-abi3-macosx_10_5_intel",
  "cp32-abi3-macosx_10_5_fat64",
  "cp32-abi3-macosx_10_5_fat32",
  "cp32-abi3-macosx_10_5_universal2",
  "cp32-abi3-macosx_10_5_universal",
  "cp32-abi3-macosx_10_4_x86_64",
  "cp32-abi3-macosx_10_4_intel",
  "cp32-abi3-macosx_10_4_fat64",
  "cp32-abi3-macosx_10_4_fat32",
  "cp32-abi3-macosx_10_4_universal2",
  "cp32-abi3-macosx_10_4_universal",
  "py38-none-macosx_10_16_x86_64",
  "py38-none-macosx_10_16_intel",
  "py38-none-macosx_10_16_fat64",
  "py38-none-macosx_10_16_fat32",
  "py38-none-macosx_10_16_universal2",
  "py38-none-macosx_10_16_universal",
  "py38-none-macosx_10_15_x86_64",
  "py38-none-macosx_10_15_intel",
  "py38-none-macosx_10_15_fat64",
  "py38-none-macosx_10_15_fat32",
  "py38-none-macosx_10_15_universal2",
  "py38-none-macosx_10_15_universal",
  "py38-none-macosx_10_14_x86_64",
  "py38-none-macosx_10_14_intel",
  "py38-none-macosx_10_14_fat64",
  "py38-none-macosx_10_14_fat32",
  "py38-none-macosx_10_14_universal2",
  "py38-none-macosx_10_14_universal",
  "py38-none-macosx_10_13_x86_64",
  "py38-none-macosx_10_13_intel",
  "py38-none-macosx_10_13_fat64",
  "py38-none-macosx_10_13_fat32",
  "py38-none-macosx_10_13_universal2",
  "py38-none-macosx_10_13_universal",
  "py38-none-macosx_10_12_x86_64",
  "py38-none-macosx_10_12_intel",
  "py38-none-macosx_10_12_fat64",
  "py38-none-macosx_10_12_fat32",
  "py38-none-macosx_10_12_universal2",
  "py38-none-macosx_10_12_universal",
  "py38-none-macosx_10_11_x86_64",
  "py38-none-macosx_10_11_intel",
  "py38-none-macosx_10_11_fat64",
  "py38-none-macosx_10_11_fat32",
  "py38-none-macosx_10_11_universal2",
  "py38-none-macosx_10_11_universal",
  "py38-none-macosx_10_10_x86_64",
  "py38-none-macosx_10_10_intel",
  "py38-none-macosx_10_10_fat64",
  "py38-none-macosx_10_10_fat32",
  "py38-none-macosx_10_10_universal2",
  "py38-none-macosx_10_10_universal",
  "py38-none-macosx_10_9_x86_64",
  "py38-none-macosx_10_9_intel",
  "py38-none-macosx_10_9_fat64",
  "py38-none-macosx_10_9_fat32",
  "py38-none-macosx_10_9_universal2",
  "py38-none-macosx_10_9_universal",
  "py38-none-macosx_10_8_x86_64",
  "py38-none-macosx_10_8_intel",
  "py38-none-macosx_10_8_fat64",
  "py38-none-macosx_10_8_fat32",
  "py38-none-macosx_10_8_universal2",
  "py38-none-macosx_10_8_universal",
  "py38-none-macosx_10_7_x86_64",
  "py38-none-macosx_10_7_intel",
  "py38-none-macosx_10_7_fat64",
  "py38-none-macosx_10_7_fat32",
  "py38-none-macosx_10_7_universal2",
  "py38-none-macosx_10_7_universal",
  "py38-none-macosx_10_6_x86_64",
  "py38-none-macosx_10_6_intel",
  "py38-none-macosx_10_6_fat64",
  "py38-none-macosx_10_6_fat32",
  "py38-none-macosx_10_6_universal2",
  "py38-none-macosx_10_6_universal",
  "py38-none-macosx_10_5_x86_64",
  "py38-none-macosx_10_5_intel",
  "py38-none-macosx_10_5_fat64",
  "py38-none-macosx_10_5_fat32",
  "py38-none-macosx_10_5_universal2",
  "py38-none-macosx_10_5_universal",
  "py38-none-macosx_10_4_x86_64",
  "py38-none-macosx_10_4_intel",
  "py38-none-macosx_10_4_fat64",
  "py38-none-macosx_10_4_fat32",
  "py38-none-macosx_10_4_universal2",
  "py38-none-macosx_10_4_universal",
  "py3-none-macosx_10_16_x86_64",
  "py3-none-macosx_10_16_intel",
  "py3-none-macosx_10_16_fat64",
  "py3-none-macosx_10_16_fat32",
  "py3-none-macosx_10_16_universal2",
  "py3-none-macosx_10_16_universal",
  "py3-none-macosx_10_15_x86_64",
  "py3-none-macosx_10_15_intel",
  "py3-none-macosx_10_15_fat64",
  "py3-none-macosx_10_15_fat32",
  "py3-none-macosx_10_15_universal2",
  "py3-none-macosx_10_15_universal",
  "py3-none-macosx_10_14_x86_64",
  "py3-none-macosx_10_14_intel",
  "py3-none-macosx_10_14_fat64",
  "py3-none-macosx_10_14_fat32",
  "py3-none-macosx_10_14_universal2",
  "py3-none-macosx_10_14_universal",
  "py3-none-macosx_10_13_x86_64",
  "py3-none-macosx_10_13_intel",
  "py3-none-macosx_10_13_fat64",
  "py3-none-macosx_10_13_fat32",
  "py3-none-macosx_10_13_universal2",
  "py3-none-macosx_10_13_universal",
  "py3-none-macosx_10_12_x86_64",
  "py3-none-macosx_10_12_intel",
  "py3-none-macosx_10_12_fat64",
  "py3-none-macosx_10_12_fat32",
  "py3-none-macosx_10_12_universal2",
  "py3-none-macosx_10_12_universal",
  "py3-none-macosx_10_11_x86_64",
  "py3-none-macosx_10_11_intel",
  "py3-none-macosx_10_11_fat64",
  "py3-none-macosx_10_11_fat32",
  "py3-none-macosx_10_11_universal2",
  "py3-none-macosx_10_11_universal",
  "py3-none-macosx_10_10_x86_64",
  "py3-none-macosx_10_10_intel",
  "py3-none-macosx_10_10_fat64",
  "py3-none-macosx_10_10_fat32",
  "py3-none-macosx_10_10_universal2",
  "py3-none-macosx_10_10_universal",
  "py3-none-macosx_10_9_x86_64",
  "py3-none-macosx_10_9_intel",
  "py3-none-macosx_10_9_fat64",
  "py3-none-macosx_10_9_fat32",
  "py3-none-macosx_10_9_universal2",
  "py3-none-macosx_10_9_universal",
  "py3-none-macosx_10_8_x86_64",
  "py3-none-macosx_10_8_intel",
  "py3-none-macosx_10_8_fat64",
  "py3-none-macosx_10_8_fat32",
  "py3-none-macosx_10_8_universal2",
  "py3-none-macosx_10_8_universal",
  "py3-none-macosx_10_7_x86_64",
  "py3-none-macosx_10_7_intel",
  "py3-none-macosx_10_7_fat64",
  "py3-none-macosx_10_7_fat32",
  "py3-none-macosx_10_7_universal2",
  "py3-none-macosx_10_7_universal",
  "py3-none-macosx_10_6_x86_64",
  "py3-none-macosx_10_6_intel",
  "py3-none-macosx_10_6_fat64",
  "py3-none-macosx_10_6_fat32",
  "py3-none-macosx_10_6_universal2",
  "py3-none-macosx_10_6_universal",
  "py3-none-macosx_10_5_x86_64",
  "py3-none-macosx_10_5_intel",
  "py3-none-macosx_10_5_fat64",
  "py3-none-macosx_10_5_fat32",
  "py3-none-macosx_10_5_universal2",
  "py3-none-macosx_10_5_universal",
  "py3-none-macosx_10_4_x86_64",
  "py3-none-macosx_10_4_intel",
  "py3-none-macosx_10_4_fat64",
  "py3-none-macosx_10_4_fat32",
  "py3-none-macosx_10_4_universal2",
  "py3-none-macosx_10_4_universal",
  "py37-none-macosx_10_16_x86_64",
  "py37-none-macosx_10_16_intel",
  "py37-none-macosx_10_16_fat64",
  "py37-none-macosx_10_16_fat32",
  "py37-none-macosx_10_16_universal2",
  "py37-none-macosx_10_16_universal",
  "py37-none-macosx_10_15_x86_64",
  "py37-none-macosx_10_15_intel",
  "py37-none-macosx_10_15_fat64",
  "py37-none-macosx_10_15_fat32",
  "py37-none-macosx_10_15_universal2",
  "py37-none-macosx_10_15_universal",
  "py37-none-macosx_10_14_x86_64",
  "py37-none-macosx_10_14_intel",
  "py37-none-macosx_10_14_fat64",
  "py37-none-macosx_10_14_fat32",
  "py37-none-macosx_10_14_universal2",
  "py37-none-macosx_10_14_universal",
  "py37-none-macosx_10_13_x86_64",
  "py37-none-macosx_10_13_intel",
  "py37-none-macosx_10_13_fat64",
  "py37-none-macosx_10_13_fat32",
  "py37-none-macosx_10_13_universal2",
  "py37-none-macosx_10_13_universal",
  "py37-none-macosx_10_12_x86_64",
  "py37-none-macosx_10_12_intel",
  "py37-none-macosx_10_12_fat64",
  "py37-none-macosx_10_12_fat32",
  "py37-none-macosx_10_12_universal2",
  "py37-none-macosx_10_12_universal",
  "py37-none-macosx_10_11_x86_64",
  "py37-none-macosx_10_11_intel",
  "py37-none-macosx_10_11_fat64",
  "py37-none-macosx_10_11_fat32",
  "py37-none-macosx_10_11_universal2",
  "py37-none-macosx_10_11_universal",
  "py37-none-macosx_10_10_x86_64",
  "py37-none-macosx_10_10_intel",
  "py37-none-macosx_10_10_fat64",
  "py37-none-macosx_10_10_fat32",
  "py37-none-macosx_10_10_universal2",
  "py37-none-macosx_10_10_universal",
  "py37-none-macosx_10_9_x86_64",
  "py37-none-macosx_10_9_intel",
  "py37-none-macosx_10_9_fat64",
  "py37-none-macosx_10_9_fat32",
  "py37-none-macosx_10_9_universal2",
  "py37-none-macosx_10_9_universal",
  "py37-none-macosx_10_8_x86_64",
  "py37-none-macosx_10_8_intel",
  "py37-none-macosx_10_8_fat64",
  "py37-none-macosx_10_8_fat32",
  "py37-none-macosx_10_8_universal2",
  "py37-none-macosx_10_8_universal",
  "py37-none-macosx_10_7_x86_64",
  "py37-none-macosx_10_7_intel",
  "py37-none-macosx_10_7_fat64",
  "py37-none-macosx_10_7_fat32",
  "py37-none-macosx_10_7_universal2",
  "py37-none-macosx_10_7_universal",
  "py37-none-macosx_10_6_x86_64",
  "py37-none-macosx_10_6_intel",
  "py37-none-macosx_10_6_fat64",
  "py37-none-macosx_10_6_fat32",
  "py37-none-macosx_10_6_universal2",
  "py37-none-macosx_10_6_universal",
  "py37-none-macosx_10_5_x86_64",
  "py37-none-macosx_10_5_intel",
  "py37-none-macosx_10_5_fat64",
  "py37-none-macosx_10_5_fat32",
  "py37-none-macosx_10_5_universal2",
  "py37-none-macosx_10_5_universal",
  "py37-none-macosx_10_4_x86_64",
  "py37-none-macosx_10_4_intel",
  "py37-none-macosx_10_4_fat64",
  "py37-none-macosx_10_4_fat32",
  "py37-none-macosx_10_4_universal2",
  "py37-none-macosx_10_4_universal",
  "py36-none-macosx_10_16_x86_64",
  "py36-none-macosx_10_16_intel",
  "py36-none-macosx_10_16_fat64",
  "py36-none-macosx_10_16_fat32",
  "py36-none-macosx_10_16_universal2",
  "py36-none-macosx_10_16_universal",
  "py36-none-macosx_10_15_x86_64",
  "py36-none-macosx_10_15_intel",
  "py36-none-macosx_10_15_fat64",
  "py36-none-macosx_10_15_fat32",
  "py36-none-macosx_10_15_universal2",
  "py36-none-macosx_10_15_universal",
  "py36-none-macosx_10_14_x86_64",
  "py36-none-macosx_10_14_intel",
  "py36-none-macosx_10_14_fat64",
  "py36-none-macosx_10_14_fat32",
  "py36-none-macosx_10_14_universal2",
  "py36-none-macosx_10_14_universal",
  "py36-none-macosx_10_13_x86_64",
  "py36-none-macosx_10_13_intel",
  "py36-none-macosx_10_13_fat64",
  "py36-none-macosx_10_13_fat32",
  "py36-none-macosx_10_13_universal2",
  "py36-none-macosx_10_13_universal",
  "py36-none-macosx_10_12_x86_64",
  "py36-none-macosx_10_12_intel",
  "py36-none-macosx_10_12_fat64",
  "py36-none-macosx_10_12_fat32",
  "py36-none-macosx_10_12_universal2",
  "py36-none-macosx_10_12_universal",
  "py36-none-macosx_10_11_x86_64",
  "py36-none-macosx_10_11_intel",
  "py36-none-macosx_10_11_fat64",
  "py36-none-macosx_10_11_fat32",
  "py36-none-macosx_10_11_universal2",
  "py36-none-macosx_10_11_universal",
  "py36-none-macosx_10_10_x86_64",
  "py36-none-macosx_10_10_intel",
  "py36-none-macosx_10_10_fat64",
  "py36-none-macosx_10_10_fat32",
  "py36-none-macosx_10_10_universal2",
  "py36-none-macosx_10_10_universal",
  "py36-none-macosx_10_9_x86_64",
  "py36-none-macosx_10_9_intel",
  "py36-none-macosx_10_9_fat64",
  "py36-none-macosx_10_9_fat32",
  "py36-none-macosx_10_9_universal2",
  "py36-none-macosx_10_9_universal",
  "py36-none-macosx_10_8_x86_64",
  "py36-none-macosx_10_8_intel",
  "py36-none-macosx_10_8_fat64",
  "py36-none-macosx_10_8_fat32",
  "py36-none-macosx_10_8_universal2",
  "py36-none-macosx_10_8_universal",
  "py36-none-macosx_10_7_x86_64",
  "py36-none-macosx_10_7_intel",
  "py36-none-macosx_10_7_fat64",
  "py36-none-macosx_10_7_fat32",
  "py36-none-macosx_10_7_universal2",
  "py36-none-macosx_10_7_universal",
  "py36-none-macosx_10_6_x86_64",
  "py36-none-macosx_10_6_intel",
  "py36-none-macosx_10_6_fat64",
  "py36-none-macosx_10_6_fat32",
  "py36-none-macosx_10_6_universal2",
  "py36-none-macosx_10_6_universal",
  "py36-none-macosx_10_5_x86_64",
  "py36-none-macosx_10_5_intel",
  "py36-none-macosx_10_5_fat64",
  "py36-none-macosx_10_5_fat32",
  "py36-none-macosx_10_5_universal2",
  "py36-none-macosx_10_5_universal",
  "py36-none-macosx_10_4_x86_64",
  "py36-none-macosx_10_4_intel",
  "py36-none-macosx_10_4_fat64",
  "py36-none-macosx_10_4_fat32",
  "py36-none-macosx_10_4_universal2",
  "py36-none-macosx_10_4_universal",
  "py35-none-macosx_10_16_x86_64",
  "py35-none-macosx_10_16_intel",
  "py35-none-macosx_10_16_fat64",
  "py35-none-macosx_10_16_fat32",
  "py35-none-macosx_10_16_universal2",
  "py35-none-macosx_10_16_universal",
  "py35-none-macosx_10_15_x86_64",
  "py35-none-macosx_10_15_intel",
  "py35-none-macosx_10_15_fat64",
  "py35-none-macosx_10_15_fat32",
  "py35-none-macosx_10_15_universal2",
  "py35-none-macosx_10_15_universal",
  "py35-none-macosx_10_14_x86_64",
  "py35-none-macosx_10_14_intel",
  "py35-none-macosx_10_14_fat64",
  "py35-none-macosx_10_14_fat32",
  "py35-none-macosx_10_14_universal2",
  "py35-none-macosx_10_14_universal",
  "py35-none-macosx_10_13_x86_64",
  "py35-none-macosx_10_13_intel",
  "py35-none-macosx_10_13_fat64",
  "py35-none-macosx_10_13_fat32",
  "py35-none-macosx_10_13_universal2",
  "py35-none-macosx_10_13_universal",
  "py35-none-macosx_10_12_x86_64",
  "py35-none-macosx_10_12_intel",
  "py35-none-macosx_10_12_fat64",
  "py35-none-macosx_10_12_fat32",
  "py35-none-macosx_10_12_universal2",
  "py35-none-macosx_10_12_universal",
  "py35-none-macosx_10_11_x86_64",
  "py35-none-macosx_10_11_intel",
  "py35-none-macosx_10_11_fat64",
  "py35-none-macosx_10_11_fat32",
  "py35-none-macosx_10_11_universal2",
  "py35-none-macosx_10_11_universal",
  "py35-none-macosx_10_10_x86_64",
  "py35-none-macosx_10_10_intel",
  "py35-none-macosx_10_10_fat64",
  "py35-none-macosx_10_10_fat32",
  "py35-none-macosx_10_10_universal2",
  "py35-none-macosx_10_10_universal",
  "py35-none-macosx_10_9_x86_64",
  "py35-none-macosx_10_9_intel",
  "py35-none-macosx_10_9_fat64",
  "py35-none-macosx_10_9_fat32",
  "py35-none-macosx_10_9_universal2",
  "py35-none-macosx_10_9_universal",
  "py35-none-macosx_10_8_x86_64",
  "py35-none-macosx_10_8_intel",
  "py35-none-macosx_10_8_fat64",
  "py35-none-macosx_10_8_fat32",
  "py35-none-macosx_10_8_universal2",
  "py35-none-macosx_10_8_universal",
  "py35-none-macosx_10_7_x86_64",
  "py35-none-macosx_10_7_intel",
  "py35-none-macosx_10_7_fat64",
  "py35-none-macosx_10_7_fat32",
  "py35-none-macosx_10_7_universal2",
  "py35-none-macosx_10_7_universal",
  "py35-none-macosx_10_6_x86_64",
  "py35-none-macosx_10_6_intel",
  "py35-none-macosx_10_6_fat64",
  "py35-none-macosx_10_6_fat32",
  "py35-none-macosx_10_6_universal2",
  "py35-none-macosx_10_6_universal",
  "py35-none-macosx_10_5_x86_64",
  "py35-none-macosx_10_5_intel",
  "py35-none-macosx_10_5_fat64",
  "py35-none-macosx_10_5_fat32",
  "py35-none-macosx_10_5_universal2",
  "py35-none-macosx_10_5_universal",
  "py35-none-macosx_10_4_x86_64",
  "py35-none-macosx_10_4_intel",
  "py35-none-macosx_10_4_fat64",
  "py35-none-macosx_10_4_fat32",
  "py35-none-macosx_10_4_universal2",
  "py35-none-macosx_10_4_universal",
  "py34-none-macosx_10_16_x86_64",
  "py34-none-macosx_10_16_intel",
  "py34-none-macosx_10_16_fat64",
  "py34-none-macosx_10_16_fat32",
  "py34-none-macosx_10_16_universal2",
  "py34-none-macosx_10_16_universal",
  "py34-none-macosx_10_15_x86_64",
  "py34-none-macosx_10_15_intel",
  "py34-none-macosx_10_15_fat64",
  "py34-none-macosx_10_15_fat32",
  "py34-none-macosx_10_15_universal2",
  "py34-none-macosx_10_15_universal",
  "py34-none-macosx_10_14_x86_64",
  "py34-none-macosx_10_14_intel",
  "py34-none-macosx_10_14_fat64",
  "py34-none-macosx_10_14_fat32",
  "py34-none-macosx_10_14_universal2",
  "py34-none-macosx_10_14_universal",
  "py34-none-macosx_10_13_x86_64",
  "py34-none-macosx_10_13_intel",
  "py34-none-macosx_10_13_fat64",
  "py34-none-macosx_10_13_fat32",
  "py34-none-macosx_10_13_universal2",
  "py34-none-macosx_10_13_universal",
  "py34-none-macosx_10_12_x86_64",
  "py34-none-macosx_10_12_intel",
  "py34-none-macosx_10_12_fat64",
  "py34-none-macosx_10_12_fat32",
  "py34-none-macosx_10_12_universal2",
  "py34-none-macosx_10_12_universal",
  "py34-none-macosx_10_11_x86_64",
  "py34-none-macosx_10_11_intel",
  "py34-none-macosx_10_11_fat64",
  "py34-none-macosx_10_11_fat32",
  "py34-none-macosx_10_11_universal2",
  "py34-none-macosx_10_11_universal",
  "py34-none-macosx_10_10_x86_64",
  "py34-none-macosx_10_10_intel",
  "py34-none-macosx_10_10_fat64",
  "py34-none-macosx_10_10_fat32",
  "py34-none-macosx_10_10_universal2",
  "py34-none-macosx_10_10_universal",
  "py34-none-macosx_10_9_x86_64",
  "py34-none-macosx_10_9_intel",
  "py34-none-macosx_10_9_fat64",
  "py34-none-macosx_10_9_fat32",
  "py34-none-macosx_10_9_universal2",
  "py34-none-macosx_10_9_universal",
  "py34-none-macosx_10_8_x86_64",
  "py34-none-macosx_10_8_intel",
  "py34-none-macosx_10_8_fat64",
  "py34-none-macosx_10_8_fat32",
  "py34-none-macosx_10_8_universal2",
  "py34-none-macosx_10_8_universal",
  "py34-none-macosx_10_7_x86_64",
  "py34-none-macosx_10_7_intel",
  "py34-none-macosx_10_7_fat64",
  "py34-none-macosx_10_7_fat32",
  "py34-none-macosx_10_7_universal2",
  "py34-none-macosx_10_7_universal",
  "py34-none-macosx_10_6_x86_64",
  "py34-none-macosx_10_6_intel",
  "py34-none-macosx_10_6_fat64",
  "py34-none-macosx_10_6_fat32",
  "py34-none-macosx_10_6_universal2",
  "py34-none-macosx_10_6_universal",
  "py34-none-macosx_10_5_x86_64",
  "py34-none-macosx_10_5_intel",
  "py34-none-macosx_10_5_fat64",
  "py34-none-macosx_10_5_fat32",
  "py34-none-macosx_10_5_universal2",
  "py34-none-macosx_10_5_universal",
  "py34-none-macosx_10_4_x86_64",
  "py34-none-macosx_10_4_intel",
  "py34-none-macosx_10_4_fat64",
  "py34-none-macosx_10_4_fat32",
  "py34-none-macosx_10_4_universal2",
  "py34-none-macosx_10_4_universal",
  "py33-none-macosx_10_16_x86_64",
  "py33-none-macosx_10_16_intel",
  "py33-none-macosx_10_16_fat64",
  "py33-none-macosx_10_16_fat32",
  "py33-none-macosx_10_16_universal2",
  "py33-none-macosx_10_16_universal",
  "py33-none-macosx_10_15_x86_64",
  "py33-none-macosx_10_15_intel",
  "py33-none-macosx_10_15_fat64",
  "py33-none-macosx_10_15_fat32",
  "py33-none-macosx_10_15_universal2",
  "py33-none-macosx_10_15_universal",
  "py33-none-macosx_10_14_x86_64",
  "py33-none-macosx_10_14_intel",
  "py33-none-macosx_10_14_fat64",
  "py33-none-macosx_10_14_fat32",
  "py33-none-macosx_10_14_universal2",
  "py33-none-macosx_10_14_universal",
  "py33-none-macosx_10_13_x86_64",
  "py33-none-macosx_10_13_intel",
  "py33-none-macosx_10_13_fat64",
  "py33-none-macosx_10_13_fat32",
  "py33-none-macosx_10_13_universal2",
  "py33-none-macosx_10_13_universal",
  "py33-none-macosx_10_12_x86_64",
  "py33-none-macosx_10_12_intel",
  "py33-none-macosx_10_12_fat64",
  "py33-none-macosx_10_12_fat32",
  "py33-none-macosx_10_12_universal2",
  "py33-none-macosx_10_12_universal",
  "py33-none-macosx_10_11_x86_64",
  "py33-none-macosx_10_11_intel",
  "py33-none-macosx_10_11_fat64",
  "py33-none-macosx_10_11_fat32",
  "py33-none-macosx_10_11_universal2",
  "py33-none-macosx_10_11_universal",
  "py33-none-macosx_10_10_x86_64",
  "py33-none-macosx_10_10_intel",
  "py33-none-macosx_10_10_fat64",
  "py33-none-macosx_10_10_fat32",
  "py33-none-macosx_10_10_universal2",
  "py33-none-macosx_10_10_universal",
  "py33-none-macosx_10_9_x86_64",
  "py33-none-macosx_10_9_intel",
  "py33-none-macosx_10_9_fat64",
  "py33-none-macosx_10_9_fat32",
  "py33-none-macosx_10_9_universal2",
  "py33-none-macosx_10_9_universal",
  "py33-none-macosx_10_8_x86_64",
  "py33-none-macosx_10_8_intel",
  "py33-none-macosx_10_8_fat64",
  "py33-none-macosx_10_8_fat32",
  "py33-none-macosx_10_8_universal2",
  "py33-none-macosx_10_8_universal",
  "py33-none-macosx_10_7_x86_64",
  "py33-none-macosx_10_7_intel",
  "py33-none-macosx_10_7_fat64",
  "py33-none-macosx_10_7_fat32",
  "py33-none-macosx_10_7_universal2",
  "py33-none-macosx_10_7_universal",
  "py33-none-macosx_10_6_x86_64",
  "py33-none-macosx_10_6_intel",
  "py33-none-macosx_10_6_fat64",
  "py33-none-macosx_10_6_fat32",
  "py33-none-macosx_10_6_universal2",
  "py33-none-macosx_10_6_universal",
  "py33-none-macosx_10_5_x86_64",
  "py33-none-macosx_10_5_intel",
  "py33-none-macosx_10_5_fat64",
  "py33-none-macosx_10_5_fat32",
  "py33-none-macosx_10_5_universal2",
  "py33-none-macosx_10_5_universal",
  "py33-none-macosx_10_4_x86_64",
  "py33-none-macosx_10_4_intel",
  "py33-none-macosx_10_4_fat64",
  "py33-none-macosx_10_4_fat32",
  "py33-none-macosx_10_4_universal2",
  "py33-none-macosx_10_4_universal",
  "py32-none-macosx_10_16_x86_64",
  "py32-none-macosx_10_16_intel",
  "py32-none-macosx_10_16_fat64",
  "py32-none-macosx_10_16_fat32",
  "py32-none-macosx_10_16_universal2",
  "py32-none-macosx_10_16_universal",
  "py32-none-macosx_10_15_x86_64",
  "py32-none-macosx_10_15_intel",
  "py32-none-macosx_10_15_fat64",
  "py32-none-macosx_10_15_fat32",
  "py32-none-macosx_10_15_universal2",
  "py32-none-macosx_10_15_universal",
  "py32-none-macosx_10_14_x86_64",
  "py32-none-macosx_10_14_intel",
  "py32-none-macosx_10_14_fat64",
  "py32-none-macosx_10_14_fat32",
  "py32-none-macosx_10_14_universal2",
  "py32-none-macosx_10_14_universal",
  "py32-none-macosx_10_13_x86_64",
  "py32-none-macosx_10_13_intel",
  "py32-none-macosx_10_13_fat64",
  "py32-none-macosx_10_13_fat32",
  "py32-none-macosx_10_13_universal2",
  "py32-none-macosx_10_13_universal",
  "py32-none-macosx_10_12_x86_64",
  "py32-none-macosx_10_12_intel",
  "py32-none-macosx_10_12_fat64",
  "py32-none-macosx_10_12_fat32",
  "py32-none-macosx_10_12_universal2",
  "py32-none-macosx_10_12_universal",
  "py32-none-macosx_10_11_x86_64",
  "py32-none-macosx_10_11_intel",
  "py32-none-macosx_10_11_fat64",
  "py32-none-macosx_10_11_fat32",
  "py32-none-macosx_10_11_universal2",
  "py32-none-macosx_10_11_universal",
  "py32-none-macosx_10_10_x86_64",
  "py32-none-macosx_10_10_intel",
  "py32-none-macosx_10_10_fat64",
  "py32-none-macosx_10_10_fat32",
  "py32-none-macosx_10_10_universal2",
  "py32-none-macosx_10_10_universal",
  "py32-none-macosx_10_9_x86_64",
  "py32-none-macosx_10_9_intel",
  "py32-none-macosx_10_9_fat64",
  "py32-none-macosx_10_9_fat32",
  "py32-none-macosx_10_9_universal2",
  "py32-none-macosx_10_9_universal",
  "py32-none-macosx_10_8_x86_64",
  "py32-none-macosx_10_8_intel",
  "py32-none-macosx_10_8_fat64",
  "py32-none-macosx_10_8_fat32",
  "py32-none-macosx_10_8_universal2",
  "py32-none-macosx_10_8_universal",
  "py32-none-macosx_10_7_x86_64",
  "py32-none-macosx_10_7_intel",
  "py32-none-macosx_10_7_fat64",
  "py32-none-macosx_10_7_fat32",
  "py32-none-macosx_10_7_universal2",
  "py32-none-macosx_10_7_universal",
  "py32-none-macosx_10_6_x86_64",
  "py32-none-macosx_10_6_intel",
  "py32-none-macosx_10_6_fat64",
  "py32-none-macosx_10_6_fat32",
  "py32-none-macosx_10_6_universal2",
  "py32-none-macosx_10_6_universal",
  "py32-none-macosx_10_5_x86_64",
  "py32-none-macosx_10_5_intel",
  "py32-none-macosx_10_5_fat64",
  "py32-none-macosx_10_5_fat32",
  "py32-none-macosx_10_5_universal2",
  "py32-none-macosx_10_5_universal",
  "py32-none-macosx_10_4_x86_64",
  "py32-none-macosx_10_4_intel",
  "py32-none-macosx_10_4_fat64",
  "py32-none-macosx_10_4_fat32",
  "py32-none-macosx_10_4_universal2",
  "py32-none-macosx_10_4_universal",
  "py31-none-macosx_10_16_x86_64",
  "py31-none-macosx_10_16_intel",
  "py31-none-macosx_10_16_fat64",
  "py31-none-macosx_10_16_fat32",
  "py31-none-macosx_10_16_universal2",
  "py31-none-macosx_10_16_universal",
  "py31-none-macosx_10_15_x86_64",
  "py31-none-macosx_10_15_intel",
  "py31-none-macosx_10_15_fat64",
  "py31-none-macosx_10_15_fat32",
  "py31-none-macosx_10_15_universal2",
  "py31-none-macosx_10_15_universal",
  "py31-none-macosx_10_14_x86_64",
  "py31-none-macosx_10_14_intel",
  "py31-none-macosx_10_14_fat64",
  "py31-none-macosx_10_14_fat32",
  "py31-none-macosx_10_14_universal2",
  "py31-none-macosx_10_14_universal",
  "py31-none-macosx_10_13_x86_64",
  "py31-none-macosx_10_13_intel",
  "py31-none-macosx_10_13_fat64",
  "py31-none-macosx_10_13_fat32",
  "py31-none-macosx_10_13_universal2",
  "py31-none-macosx_10_13_universal",
  "py31-none-macosx_10_12_x86_64",
  "py31-none-macosx_10_12_intel",
  "py31-none-macosx_10_12_fat64",
  "py31-none-macosx_10_12_fat32",
  "py31-none-macosx_10_12_universal2",
  "py31-none-macosx_10_12_universal",
  "py31-none-macosx_10_11_x86_64",
  "py31-none-macosx_10_11_intel",
  "py31-none-macosx_10_11_fat64",
  "py31-none-macosx_10_11_fat32",
  "py31-none-macosx_10_11_universal2",
  "py31-none-macosx_10_11_universal",
  "py31-none-macosx_10_10_x86_64",
  "py31-none-macosx_10_10_intel",
  "py31-none-macosx_10_10_fat64",
  "py31-none-macosx_10_10_fat32",
  "py31-none-macosx_10_10_universal2",
  "py31-none-macosx_10_10_universal",
  "py31-none-macosx_10_9_x86_64",
  "py31-none-macosx_10_9_intel",
  "py31-none-macosx_10_9_fat64",
  "py31-none-macosx_10_9_fat32",
  "py31-none-macosx_10_9_universal2",
  "py31-none-macosx_10_9_universal",
  "py31-none-macosx_10_8_x86_64",
  "py31-none-macosx_10_8_intel",
  "py31-none-macosx_10_8_fat64",
  "py31-none-macosx_10_8_fat32",
  "py31-none-macosx_10_8_universal2",
  "py31-none-macosx_10_8_universal",
  "py31-none-macosx_10_7_x86_64",
  "py31-none-macosx_10_7_intel",
  "py31-none-macosx_10_7_fat64",
  "py31-none-macosx_10_7_fat32",
  "py31-none-macosx_10_7_universal2",
  "py31-none-macosx_10_7_universal",
  "py31-none-macosx_10_6_x86_64",
  "py31-none-macosx_10_6_intel",
  "py31-none-macosx_10_6_fat64",
  "py31-none-macosx_10_6_fat32",
  "py31-none-macosx_10_6_universal2",
  "py31-none-macosx_10_6_universal",
  "py31-none-macosx_10_5_x86_64",
  "py31-none-macosx_10_5_intel",
  "py31-none-macosx_10_5_fat64",
  "py31-none-macosx_10_5_fat32",
  "py31-none-macosx_10_5_universal2",
  "py31-none-macosx_10_5_universal",
  "py31-none-macosx_10_4_x86_64",
  "py31-none-macosx_10_4_intel",
  "py31-none-macosx_10_4_fat64",
  "py31-none-macosx_10_4_fat32",
  "py31-none-macosx_10_4_universal2",
  "py31-none-macosx_10_4_universal",
  "py30-none-macosx_10_16_x86_64",
  "py30-none-macosx_10_16_intel",
  "py30-none-macosx_10_16_fat64",
  "py30-none-macosx_10_16_fat32",
  "py30-none-macosx_10_16_universal2",
  "py30-none-macosx_10_16_universal",
  "py30-none-macosx_10_15_x86_64",
  "py30-none-macosx_10_15_intel",
  "py30-none-macosx_10_15_fat64",
  "py30-none-macosx_10_15_fat32",
  "py30-none-macosx_10_15_universal2",
  "py30-none-macosx_10_15_universal",
  "py30-none-macosx_10_14_x86_64",
  "py30-none-macosx_10_14_intel",
  "py30-none-macosx_10_14_fat64",
  "py30-none-macosx_10_14_fat32",
  "py30-none-macosx_10_14_universal2",
  "py30-none-macosx_10_14_universal",
  "py30-none-macosx_10_13_x86_64",
  "py30-none-macosx_10_13_intel",
  "py30-none-macosx_10_13_fat64",
  "py30-none-macosx_10_13_fat32",
  "py30-none-macosx_10_13_universal2",
  "py30-none-macosx_10_13_universal",
  "py30-none-macosx_10_12_x86_64",
  "py30-none-macosx_10_12_intel",
  "py30-none-macosx_10_12_fat64",
  "py30-none-macosx_10_12_fat32",
  "py30-none-macosx_10_12_universal2",
  "py30-none-macosx_10_12_universal",
  "py30-none-macosx_10_11_x86_64",
  "py30-none-macosx_10_11_intel",
  "py30-none-macosx_10_11_fat64",
  "py30-none-macosx_10_11_fat32",
  "py30-none-macosx_10_11_universal2",
  "py30-none-macosx_10_11_universal",
  "py30-none-macosx_10_10_x86_64",
  "py30-none-macosx_10_10_intel",
  "py30-none-macosx_10_10_fat64",
  "py30-none-macosx_10_10_fat32",
  "py30-none-macosx_10_10_universal2",
  "py30-none-macosx_10_10_universal",
  "py30-none-macosx_10_9_x86_64",
  "py30-none-macosx_10_9_intel",
  "py30-none-macosx_10_9_fat64",
  "py30-none-macosx_10_9_fat32",
  "py30-none-macosx_10_9_universal2",
  "py30-none-macosx_10_9_universal",
  "py30-none-macosx_10_8_x86_64",
  "py30-none-macosx_10_8_intel",
  "py30-none-macosx_10_8_fat64",
  "py30-none-macosx_10_8_fat32",
  "py30-none-macosx_10_8_universal2",
  "py30-none-macosx_10_8_universal",
  "py30-none-macosx_10_7_x86_64",
  "py30-none-macosx_10_7_intel",
  "py30-none-macosx_10_7_fat64",
  "py30-none-macosx_10_7_fat32",
  "py30-none-macosx_10_7_universal2",
  "py30-none-macosx_10_7_universal",
  "py30-none-macosx_10_6_x86_64",
  "py30-none-macosx_10_6_intel",
  "py30-none-macosx_10_6_fat64",
  "py30-none-macosx_10_6_fat32",
  "py30-none-macosx_10_6_universal2",
  "py30-none-macosx_10_6_universal",
  "py30-none-macosx_10_5_x86_64",
  "py30-none-macosx_10_5_intel",
  "py30-none-macosx_10_5_fat64",
  "py30-none-macosx_10_5_fat32",
  "py30-none-macosx_10_5_universal2",
  "py30-none-macosx_10_5_universal",
  "py30-none-macosx_10_4_x86_64",
  "py30-none-macosx_10_4_intel",
  "py30-none-macosx_10_4_fat64",
  "py30-none-macosx_10_4_fat32",
  "py30-none-macosx_10_4_universal2",
  "py30-none-macosx_10_4_universal",
  "py38-none-any",
  "py3-none-any",
  "py37-none-any",
  "py36-none-any",
  "py35-none-any",
  "py34-none-any",
  "py33-none-any",
  "py32-none-any",
  "py31-none-any",
  "py30-none-any"
]

This is similar to how the Docker container gets the environment inside the Docker container.

@henryiii
Copy link
Contributor

henryiii commented Feb 5, 2021

The changes this would require (run only on one Python) are exactly opposite the long-term solution (run on all Pythons supported for testing), so I think it would be better to solve correctly once. I'm guessing this will miss the next release, which is a shame (I have at least one abi3 project identified that I might try to suggest cibuildwheel), but not worth delaying a release.

@YannickJadoul
Copy link
Member Author

YannickJadoul commented Feb 24, 2021

Sorry, this has been dragging on as I couldn't find time and motivation at the same time, recently.

One thing to note/discuss, though: after #607 failing because the wrong version of Python got installed and created the same wheel, are we still convinced that detecting use of the limited API though duplicate filenames is a good plan?

@joerick
Copy link
Contributor

joerick commented Feb 24, 2021

No worries, I have also been struggling for one or the other of those lately!

One thing to note/discuss, though: after #607 failing because the wrong version of Python got installed and created the same wheel, are we still convinced that detecting use of the limited API though duplicate filenames is a good plan?

"though duplicate filenames" - I'm not sure I fully understand the problem you foresee... if we had limited-api support, the issue in #607 would still have been caught because the test would have expected a different wheel, right?

@YannickJadoul
Copy link
Member Author

if we had limited-api support, the issue in #607 would still have been caught because the test would have expected a different wheel, right?

Right, that's true! We just never got to the tests, because something else failed earlier. Thanks for setting that right! :-)

@joerick
Copy link
Contributor

joerick commented Apr 29, 2022

Closing in favour of full support in #1091 🎉

@joerick joerick closed this Apr 29, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add support for Py_LIMITED_API ?
4 participants