Because you actually can write code that is compatible with both Python 2 and 3.<p>Also major issues people have with migration is unicode. In respect of unicode, majority of the code is simply broken and fails to work on Python 3 because Python 3 is more strict about it.<p>In Python 2 you store text and binary data as bytes (no distinction, there is unicode type but it&#x27;s more hassle to use it and frankly almost no one does use it) while in Python 3 text and binary data are two distinct types.<p>So if you have code in Python 2 and you did not distinguish what is text and what is binary now you have to go through your entire code and identify all those parts, this is especially hard since Python is dynamically typed language and you don&#x27;t have type checker to help you with that.<p>This is also why it is much easier to write Python 3 code and make it run on Python 2 as well than the other way around.<p>As for having interpreter compatibility layer. First python does not care about extension you use, and unlike some languages it actually allows you to install multiple versions at the same time without conflicts (checked 2.4 all the way to 3.5). You can easily control which version you want to use by shabang, for example:<p><pre><code>    #! &#x2F;usr&#x2F;bin&#x2F;env python2

    #! &#x2F;usr&#x2F;bin&#x2F;env python3

    #! &#x2F;usr&#x2F;bin&#x2F;env python3.5</code></pre>