11---
22---
33
4-
54Add note here to explain that this does _ not_ prevent _ nor_ discourage library
65author to release 2 version of their software one Python 3 only and the other
76python 2.
87
98This actually made the above easier and less-likely to break.
109
1110
11+ Too long, did not read:
12+
13+ - Help and encourage users to install ** pip 9.0+**
14+ - Help and encourage users to install ** setuptools 24.3+**
15+ - Use ** ` setup(..., python_requires='>=3.3') ` ** new option.
16+ - ** Fail** early at ** install time** if on Python 2.
17+
18+
1219# As a user
1320
1421## Install Pip 9.0
@@ -21,27 +28,49 @@ the community strong.
2128
2229Make sure you have Pip >= 9.0, this is especially important if you have Python
23302 installations. Having pip 9.0+ will not insure that you install will not
24- break, but they are more likely not to. Having a version off pip <9.0 can lead
31+ break, but they are more likely not to. Having a version off pip < 9.0 can lead
2532your system to try to upgrade to non-compatible versions of Python packages
2633even if these are marked as non-compatible.
2734
2835Help as many other _ users_ as possible to install pip >=9.0, for the
2936transition, it is the slowest part of the ecosystem to update, and is the only
30- piece that concerns all installations:
37+ piece that concerns all installations.
38+
39+ The simplest way to make sure all is up to date is to run the following for
40+ each installation of Python:
3141
3242 pip install --upgrade setuptools pip
3343
44+ This will install the latest version of pip and setuptools.
45+
46+ You can issue the following to see the version of pip:
47+
48+ pip --version
49+
50+
51+
3452## Setuptools
3553
3654If you are on a system that will not install python wheel and use ` setuptools ` ,
3755make sure you have setuptools >=24.2.0, or building Python 3 only libraries
38- might fail, even on Python 2.
56+ might fail. In particular if authors have taken time to mark their library as
57+ Python 3 only, the ` python_requires ` argument to ` setup() ` will not be
58+ recognize and installation will fail.
59+
60+ Use the following to check setuptools version :
61+
62+ python -c 'import setuptools; print(setuptools.__version__)
63+
64+ Again make sure tu upgrade pip and setuptools to make sure you have an up to
65+ date system:
66+
67+ pip install --upgrade setuptools pip
3968
4069## Local package index
4170
4271If you are using a custom local package index, for example if you are working
4372at a company with private packages, make sure it implement correctly
44- [ pep-503] ( https://www.python.org/dev/peps/pep-0503/ ) and let pip knows about
73+ [ pep-503] (https://www.gg python.org/dev/peps/pep-0503/) and let pip knows about
4574the ` python_requires ` field.
4675
4776## The state of PyPI
@@ -53,20 +82,21 @@ deployed yet but should hopefully be deployed soon.
5382# Preparing your library
5483
5584
56-
5785As a library author one of the most important factor in a smooth transition is
5886planning and communication, letting your user base know in advance that the
5987transition is happening and what step to take is critical for a transition.
6088
6189For your library code here the steps you need to take to ensure that
6290installation will fail in the least number of case:
6391
64- You need to release your new packages version with [ setuptools] version 24.2.0
65- or above, or use one of the alternate package manager that can set the
66- [ ` python_require ` ] metadata field. Without this, pip 9.0 ** will try** to
67- install non-compatible version of your software on Python 2. This version of
68- setuptools is recent (July 20, 2016) and this possible thank to the [ work of
69- Xavier Fernandez] ( https://github.com/pypa/setuptools/pull/631 )
92+ You need to release your new packages version with
93+ [ setuptools] ( https://pypi.python.org/pypi/setuptools ) version 24.2.0 or above.
94+ You can also use one of the alternate package manager that can set the
95+ [ Requires-Python] ( https://www.python.org/dev/peps/pep-0345/#requires-python )
96+ metadata field. Without this, pip 9.0 ** will try** to install non-compatible
97+ version of your software on Python 2. This version of setuptools is recent
98+ (July 20, 2016) and this possible thank to the [ work of Xavier
99+ Fernandez] ( https://github.com/pypa/setuptools/pull/631 )
70100
71101Add the following to your ` setup.py `
72102
@@ -81,8 +111,10 @@ setup(
81111Changes ` >=3.3 ` accordingly depending on what version your library decides to
82112support.
83113
84- This will make [ PyPI aware] (linkto mike's PR on warehouse) that your package is
85- Python 3 only, and [ allow pip] (link to pip's PR) to be [ made aware of this] (link to PyPI PR).
114+ This will make [ PyPI aware] ( https://github.com/pypa/warehouse/pull/1448 ) that
115+ your package is Python 3 only, and [ allow
116+ pip] ( https://github.com/pypa/pip/pull/3877 ) to be [ made aware of
117+ this] ( https://github.com/pypa/pypi-legacy/pull/506 ) .
86118
87119
88120- Add a warning at _ runtime_ early on master (before switching to Python 3
@@ -131,17 +163,26 @@ installed, and try to check how to prevent that for future users.
131163This this page for more information : url to here for example.
132164""")
133165
166+ ```
167+
134168
135169
136- - Make sure your version number match pep440 or you will get surprises during
137- beta in particular as the `sdist` and `wheel` will appear as being different
138- versions, in particular sdist (during beta/rc/post) might appear with a
139- greater version number than wheels... and pip will try to install the sdist
140- instead of the wheel... The regular expression is trickier than expected:
170+ Make sure your version number match pep440 or you will get surprises during
171+ beta in particular as the ` sdist ` and ` wheel ` will appear as being different
172+ versions, in particular sdist (during beta/rc/post) can appear with a greater
173+ version number than wheels. Pip thus try to install the sdist instead of the
174+ wheel, which have more chance of failing, in particular with pre 24.2 versions
175+ of setuptools.
176+
177+ The regular expression to check for validity of pep440 can be find below:
141178
142179 ` ^([1-9]\\d*!)?(0|[1-9]\\d*)(\\.(0|[1-9]\\d*))*((a|b|rc)(0|[1-9]\\d*))?(\\.post(0|[1-9]\\d*))?(\\.dev(0|[1-9]\\d*))? `
143180
144- - depend on setuptools greater than 24.3
181+
182+
183+ You can mark your library as dependent on setuptools greater than 24.3 starting
184+ now, this will insure that during the next upgrade (when the packages drop
185+ python 2 support) will have the right version of setuptools.
145186
146187
147188
@@ -156,11 +197,17 @@ the all update process broken.
156197- Leave ` setup.py ` python 2 compatible and fail early. If you detect Python 2
157198 raise a clear error message and ask user to make sure they have pip >9.0 (or
158199 migrate to Python 3). You can (try to) conditionally import pip and check for
159- its version but this might not be the same pip.
200+ its version but this might not be the same pip. Failing early is important to
201+ make sure the Python installation does not install and incompatible version.
202+ Otherwise user code can fail at runtime arbitrary later in the future, which
203+ can be a difficult to debug and fix.
160204
161205- If you control dependant packages, Make sure to include conditional
162206 dependencies depending on the version of Python.
163207
208+ - Regardless of whether the installation step fails on Python 2, implement a
209+ similar check in the top level import of your package.
210+
164211
165212# Alternative mitigation
166213
@@ -171,12 +218,55 @@ implement them.
171218
172219### Use a meta-package.
173220
221+ It is possible to release a meta-package that has _ virtually_ no code and rely
222+ on conditional dependency to install its actual core code on the user system.
223+ For example, Frob-6.0 could be a meta-package which depends on
224+ Frob-real-py2 on Python <3.0, and Frob-real-py3 on Python >= 3.4. While
225+ this approach is _ doable_ this can make import confusing.
226+
227+ Moreover, upgrading your package may need the user to explicitly tell pip to
228+ upgrade dependencies as ` pip install frob ` will only upgrade the meta-package.
229+
230+ ### Multiple Sdist.
231+
232+ Pip (used to) support a "feature" where a sdist ending in ` -pyX.Y.tar.gz ` would
233+ only be seen as compatible on Python X.Y, thus it used to be possible to
234+ publish multiple sdist of a package targeting various python version.
235+
236+ Though it is not possible anymore to upload multiple sdist on PyPI. This
237+ solution is thus not possible.
238+
239+ ### Wheel only ?
240+
241+ Break downstream packages.
242+
243+
174244
175245
176246# Why all that ?
177247
178- You might wonder why all this, it's 2016 already, so how come all these issues ?
179- Python 3 has been out for 8+ years now !
248+ You might wonder why all this, it's 2016 already, so how come all these
249+ issues ? Python 3 has been out for 8+ years now !
250+
251+ Well there are many reasons to this, first of all, this issue mostly affect
252+ libraries that are currently python 2 and Python 3 compatible at the same time.
253+ Many libraries have transitioned from Python 2-only to Python 2 + 3. And the
254+ issue of transitioning to Python 3 only is relatively recent. Technically it
255+ can also apply to libraries that are only stopping support for 2.6, or even are
256+ already Python 3 only, but are starting to stop support for earlier versions of
257+ Python. For example a library releasing a Python 3.4+ only version.
258+
259+ Python 3.3 was release end of 2012, and was the first version to support
260+ (again) ` u ` as a prefix for Unicode string. It was one of the first minor
261+ version of Python 3 that saw a majority of single-source project working both
262+ on Python 2 and Python 3. These are the Project that will likely be affected by
263+ this issue.
264+
265+ The introduction of Python 3 was chaotic, there are still strong argument both
266+ in Python 2 and Python 3 camps. In the one suffering the most from this are
267+ users. Starting with the fact that inevitably some libraries will stop support
268+ for Python 2 and release Python 3 only library. And that inevitably some system
269+ will will not be upgraded to Python 3 how can we _ ensure_ that users get the
270+ _ least_ breakage as possible ? And what are the best practices to follow.
180271
181- Well there are many reasons to this,
182272
0 commit comments