Hướng dẫn how do i run python2 when python3 is installed? - làm cách nào để chạy python2 khi python3 được cài đặt?

Bạn có thể dễ dàng duy trì các môi trường riêng biệt cho các chương trình Python 2 và chương trình Python 3 trên cùng một máy tính, mà không phải lo lắng về các chương trình tương tác với nhau. Chuyển sang môi trường được gọi là kích hoạt nó.

  1. Tạo môi trường Python 2 có tên PY2, cài đặt Python 2.7:

    conda create --name py2 python=2.7
    

  2. Tạo một môi trường mới có tên PY3, cài đặt Python 3.5:

    conda create --name py3 python=3.5
    

    Bây giờ bạn có hai môi trường để làm việc. Bạn có thể cài đặt các gói và chạy các chương trình như mong muốn trong một trong hai.

  3. Kích hoạt và sử dụng môi trường Python 2.

    Windows:

    MacOS, Linux:

  4. Vô hiệu hóa môi trường Python 2. Sử dụng môi trường PY2 của bạn để cài đặt các gói và chạy các chương trình như mong muốn. Khi hoàn thành, hủy kích hoạt môi trường.

    Windows:

    MacOS, Linux:

  5. Vô hiệu hóa môi trường Python 2. Sử dụng môi trường PY2 của bạn để cài đặt các gói và chạy các chương trình như mong muốn. Khi hoàn thành, hủy kích hoạt môi trường.

    Windows:

    MacOS, Linux:

    Vô hiệu hóa môi trường Python 2. Sử dụng môi trường PY2 của bạn để cài đặt các gói và chạy các chương trình như mong muốn. Khi hoàn thành, hủy kích hoạt môi trường.

  6. Kích hoạt và sử dụng môi trường Python 3.

    Windows:

    MacOS, Linux:

tác giả

Pháo brett

trừu tượng

Với Python 3 là tương lai của Python trong khi Python 2 vẫn đang được sử dụng tích cực, thật tốt khi có sẵn dự án của bạn cho cả hai bản phát hành chính của Python. Hướng dẫn này có nghĩa là để giúp bạn tìm ra cách tốt nhất để hỗ trợ cả Python 2 & 3 đồng thời.

Nếu bạn đang tìm cách chuyển một mô -đun mở rộng thay vì mã Python thuần túy, vui lòng xem các mô -đun mở rộng chuyển sang Python 3.Porting Extension Modules to Python 3.

Nếu bạn muốn đọc một nhà phát triển Python cốt lõi, nhận lý do tại sao Python 3 ra đời, bạn có thể đọc Nick Coghlan, Python 3 Hỏi & Đáp hoặc Brett Cannon, tại sao Python 3 tồn tại.

Để được trợ giúp về việc chuyển giao, bạn có thể xem danh sách gửi thư Python được lưu trữ.

Giải thích ngắn

Để làm cho dự án của bạn trở nên tương thích với Python 2/3, các bước cơ bản là:

  1. Chỉ lo lắng về việc hỗ trợ Python 2.7

  2. Đảm bảo rằng bạn có phạm vi kiểm tra tốt (bảo hiểm.py có thể giúp đỡ; python -m pip install coverage)

  3. Tìm hiểu sự khác biệt giữa Python 2 & 3

  4. Sử dụng Futurize (hoặc hiện đại hóa) để cập nhật mã của bạn (ví dụ: python -m pip install future)

  5. Sử dụng pylint để giúp đảm bảo bạn không hồi quy về hỗ trợ Python 3 của bạn (python -m pip install pylint)

  6. Sử dụng caniusepython3 để tìm ra những phụ thuộc nào của bạn đang ngăn chặn việc bạn sử dụng Python 3 (python -m pip install caniusepython3)

  7. Khi các phụ thuộc của bạn không còn chặn bạn nữa, hãy sử dụng tích hợp liên tục để đảm bảo bạn vẫn tương thích với Python 2 & 3 (TOX có thể giúp kiểm tra chống lại nhiều phiên bản của Python;

    conda create --name py3 python=3.5
    
    0)

  8. Xem xét sử dụng kiểm tra loại tĩnh tùy chọn để đảm bảo sử dụng loại của bạn hoạt động trong cả Python 2 & 3 (ví dụ: sử dụng MyPy để kiểm tra gõ của bạn trong cả Python 2 & Python 3;

    conda create --name py3 python=3.5
    
    1).

Ghi chú

Lưu ý: Sử dụng

conda create --name py3 python=3.5
2 đảm bảo rằng
conda create --name py3 python=3.5
3 bạn gọi là một cái được cài đặt cho Python hiện đang được sử dụng, cho dù đó là một hệ thống trên toàn hệ thống hoặc một được cài đặt trong môi trường ảo.virtual environment.

Thông tin chi tiết¶

Một điểm quan trọng về việc hỗ trợ Python 2 & 3 đồng thời là bạn có thể bắt đầu ngay hôm nay! Ngay cả khi các phụ thuộc của bạn không hỗ trợ Python 3 nhưng điều đó không có nghĩa là bạn có thể hiện đại hóa mã của mình ngay bây giờ để hỗ trợ Python 3. Hầu hết các thay đổi cần thiết để hỗ trợ Python 3 dẫn đến mã sạch hơn bằng cách sử dụng các thông lệ mới hơn ngay cả trong mã Python 2.today! Even if your dependencies are not supporting Python 3 yet that does not mean you can’t modernize your code now to support Python 3. Most changes required to support Python 3 lead to cleaner code using newer practices even in Python 2 code.

Một điểm quan trọng khác là hiện đại hóa mã Python 2 của bạn để hỗ trợ Python 3 phần lớn là tự động cho bạn. Mặc dù bạn có thể phải đưa ra một số quyết định API nhờ Python 3 làm rõ dữ liệu văn bản so với dữ liệu nhị phân, công việc cấp thấp hơn hiện được thực hiện chủ yếu cho bạn và do đó ít nhất có thể được hưởng lợi từ các thay đổi tự động ngay lập tức.

Hãy ghi nhớ những điểm chính trong khi bạn đọc về các chi tiết chuyển mã của bạn để hỗ trợ Python 2 & 3 đồng thời.

Bỏ hỗ trợ cho Python 2.6 trở lên

Mặc dù bạn có thể làm cho Python 2.5 hoạt động với Python 3, nhưng sẽ dễ dàng hơn nhiều nếu bạn chỉ phải làm việc với Python 2.7. Nếu thả Python 2.5 không phải là một tùy chọn thì sáu dự án có thể giúp bạn hỗ trợ đồng thời Python 2.5 & 3 (

conda create --name py3 python=3.5
5). Tuy nhiên, hãy nhận ra rằng gần như tất cả các dự án được liệt kê trong howto sẽ không có sẵn cho bạn.much easier if you only have to work with Python 2.7. If dropping Python 2.5 is not an option then the six project can help you support Python 2.5 & 3 simultaneously (
conda create --name py3 python=3.5
5). Do realize, though, that nearly all the projects listed in this HOWTO will not be available to you.

Nếu bạn có thể bỏ qua Python 2.5 trở lên, thì các thay đổi cần thiết đối với mã của bạn sẽ tiếp tục trông và cảm thấy như mã Python thành ngữ. Tệ nhất là bạn sẽ phải sử dụng một chức năng thay vì phương thức trong một số trường hợp hoặc phải nhập chức năng thay vì sử dụng một chức năng tích hợp, nhưng nếu không thì chuyển đổi tổng thể sẽ không cảm thấy xa lạ với bạn.

Nhưng bạn nên nhắm đến việc chỉ hỗ trợ Python 2.7. Python 2.6 không còn được hỗ trợ tự do và do đó không nhận được lỗi. Điều này có nghĩa là bạn sẽ phải giải quyết bất kỳ vấn đề nào bạn gặp phải với Python 2.6. Ngoài ra còn có một số công cụ được đề cập trong howto này không hỗ trợ Python 2.6 (ví dụ: pylint) và điều này sẽ trở nên phổ biến hơn khi thời gian trôi qua. Nó sẽ đơn giản là dễ dàng hơn cho bạn nếu bạn chỉ hỗ trợ các phiên bản của Python mà bạn phải hỗ trợ.you will have to work around any issues you come across with Python 2.6. There are also some tools mentioned in this HOWTO which do not support Python 2.6 (e.g., Pylint), and this will become more commonplace as time goes on. It will simply be easier for you if you only support the versions of Python that you have to support.

Đảm bảo bạn chỉ định hỗ trợ phiên bản thích hợp trong tệp conda create --name py3 python=3.5 6 của bạn

Trong tệp

conda create --name py3 python=3.5
6 của bạn, bạn nên có trình phân loại trove thích hợp chỉ định phiên bản nào của Python bạn hỗ trợ. Vì dự án của bạn không hỗ trợ Python 3 nhưng ít nhất bạn nên chỉ định
conda create --name py3 python=3.5
8. Lý tưởng nhất là bạn cũng nên chỉ định từng phiên bản chính/nhỏ của Python mà bạn hỗ trợ, ví dụ:
conda create --name py3 python=3.5
9.

Có phạm vi bảo hiểm kiểm tra tốt

Khi bạn có mã của mình hỗ trợ phiên bản Python 2 lâu đời nhất mà bạn muốn, bạn sẽ muốn đảm bảo bộ thử nghiệm của bạn có phạm vi bảo hiểm tốt. Một quy tắc tốt là nếu bạn muốn đủ tự tin trong bộ thử nghiệm của mình rằng bất kỳ lỗi nào xuất hiện sau khi có công cụ viết lại mã của bạn là các lỗi thực tế trong các công cụ chứ không phải trong mã của bạn. Nếu bạn muốn có một số nhắm mục tiêu, hãy cố gắng nhận được hơn 80% phạm vi bảo hiểm (và don cảm thấy tồi tệ nếu bạn thấy khó có được mức bảo hiểm tốt hơn 90%). Nếu bạn không có một công cụ để đo lường phạm vi bảo hiểm kiểm tra thì nên bảo hiểm.py được khuyến nghị.

Tìm hiểu sự khác biệt giữa Python 2 & 3¶

Khi bạn có mã được thử nghiệm tốt, bạn đã sẵn sàng để bắt đầu chuyển mã của mình sang Python 3! Nhưng để hiểu đầy đủ cách mã của bạn sẽ thay đổi và những gì bạn muốn tìm kiếm trong khi mã Doc What's New New Doc cho mỗi lần phát hành Python 3 và cuốn sách chuyển sang Python 3 (trực tuyến miễn phí). Ngoài ra còn có một tờ cheat tiện dụng từ dự án tương lai Python.“What’s New” doc for each release of Python 3 and the Porting to Python 3 book (which is free online). There is also a handy cheat sheet from the Python-Future project.

Cập nhật mã của bạn

Khi bạn cảm thấy như bạn biết những gì khác biệt trong Python 3 so với Python 2, đó là thời gian để cập nhật mã của bạn! Bạn có một sự lựa chọn giữa hai công cụ trong việc chuyển mã của bạn tự động: tương lai và hiện đại hóa. Bạn chọn công cụ nào sẽ phụ thuộc vào mức độ giống như Python 3 mà bạn muốn mã của mình. Tương lai làm hết sức mình để làm cho Python 3 thành ngữ và thực hành tồn tại trong Python 2, ví dụ: Backporting loại

import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 từ Python 3 để bạn có sự tương đương về ngữ nghĩa giữa các phiên bản chính của Python. Mặt khác, hiện đại hóa là bảo thủ hơn và nhắm mục tiêu một tập hợp Python 2/3 của Python, trực tiếp dựa vào sáu để giúp cung cấp khả năng tương thích. Vì Python 3 là tương lai, tốt nhất là nên xem xét tương lai để bắt đầu điều chỉnh theo bất kỳ thực tiễn mới nào mà Python 3 giới thiệu mà bạn chưa quen với.

Bất kể bạn chọn công cụ nào, họ sẽ cập nhật mã của bạn để chạy theo Python 3 trong khi vẫn tương thích với phiên bản Python 2 mà bạn đã bắt đầu. Tùy thuộc vào mức độ bảo thủ mà bạn muốn trở thành, bạn có thể muốn chạy công cụ qua bộ thử nghiệm của mình trước và kiểm tra trực quan DIFT để đảm bảo chuyển đổi là chính xác. Sau khi bạn đã chuyển đổi bộ thử nghiệm của mình và xác minh rằng tất cả các bài kiểm tra vẫn vượt qua như mong đợi, thì bạn có thể chuyển đổi mã ứng dụng của mình khi biết rằng bất kỳ thử nghiệm nào thất bại là lỗi dịch.

Thật không may, các công cụ có thể tự động hóa mọi thứ để làm cho mã của bạn hoạt động theo Python 3 và do đó, có một số thứ bạn sẽ cần cập nhật thủ công để nhận hỗ trợ Python 3 đầy đủ (các bước này cần thiết giữa các công cụ). Đọc tài liệu cho công cụ bạn chọn sử dụng để xem những gì nó sửa theo mặc định và những gì nó có thể làm tùy chọn để biết những gì sẽ (không) được sửa cho bạn và những gì bạn có thể phải tự sửa chữa (ví dụ: sử dụng

import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
1 trong Hàm
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
2 tích hợp được tắt theo mặc định trong hiện đại hóa). Mặc dù vậy, may mắn thay, chỉ có một vài điều cần chú ý có thể được coi là những vấn đề lớn có thể khó gỡ lỗi nếu không được theo dõi.

Phân công¶

Trong Python 3,

import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
3 chứ không phải
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
4; Tất cả sự phân chia giữa các giá trị
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
5 dẫn đến
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
6. Thay đổi này thực sự đã được lên kế hoạch kể từ Python 2.2 được phát hành vào năm 2002. Kể từ đó, người dùng đã được khuyến khích thêm
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
7 vào bất kỳ và tất cả các tệp sử dụng các toán tử
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
8 và
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
9 hoặc chạy trình thông dịch bằng cờ
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
0. Nếu bạn chưa làm điều này thì bạn sẽ cần phải thông qua mã của mình và làm hai điều:

  1. Thêm

    import sys
    
    if sys.version_info[0] == 3:
        from importlib import abc
    else:
        from importlib2 import abc
    
    7 vào các tệp của bạn

  2. Cập nhật bất kỳ nhà điều hành phân chia nào khi cần thiết để sử dụng

    import sys
    
    if sys.version_info[0] == 3:
        from importlib import abc
    else:
        from importlib2 import abc
    
    9 để sử dụng phân chia sàn hoặc tiếp tục sử dụng
    import sys
    
    if sys.version_info[0] == 3:
        from importlib import abc
    else:
        from importlib2 import abc
    
    8 và mong đợi một bản nổi

Lý do mà

import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
8 không được dịch đơn giản tự động thành
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
9 là nếu một đối tượng xác định phương thức
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
6 nhưng không phải
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
7 thì mã của bạn sẽ bắt đầu thất bại (ví dụ: một lớp do người dùng xác định điều tương tự hoặc tất cả).

Văn bản so với dữ liệu nhị phân

Trong Python 2, bạn có thể sử dụng loại

try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 cho cả dữ liệu văn bản và nhị phân. Thật không may, sự hợp lưu của hai khái niệm khác nhau có thể dẫn đến mã giòn mà đôi khi hoạt động cho một trong hai loại dữ liệu, đôi khi không. Nó cũng có thể dẫn đến API khó hiểu nếu mọi người không nói rõ rằng một cái gì đó đã chấp nhận
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 đã chấp nhận dữ liệu văn bản hoặc nhị phân thay vì một loại cụ thể. Điều này phức tạp về tình huống đặc biệt đối với bất kỳ ai hỗ trợ nhiều ngôn ngữ vì API sẽ không bận tâm hỗ trợ rõ ràng
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
2 khi họ tuyên bố hỗ trợ dữ liệu văn bản.

Để làm cho sự khác biệt giữa dữ liệu văn bản và dữ liệu nhị phân rõ ràng hơn và rõ rệt hơn, Python 3 đã làm những gì mà hầu hết các ngôn ngữ tạo ra trong thời đại của Internet đã thực hiện và tạo ra các loại dữ liệu nhị phân và nhị phân không thể được trộn lẫn với nhau (Python có quyền truy cập rộng rãi vào Internet). Đối với bất kỳ mã nào chỉ liên quan đến văn bản hoặc chỉ dữ liệu nhị phân, sự phân tách này không phải là vấn đề. Nhưng đối với mã phải đối phó với cả hai, điều đó có nghĩa là bây giờ bạn có thể phải quan tâm khi bạn đang sử dụng văn bản so với dữ liệu nhị phân, đó là lý do tại sao điều này không thể hoàn toàn tự động.

Để bắt đầu, bạn sẽ cần phải quyết định API lấy văn bản và lấy nhị phân nào (rất khuyến khích bạn không thiết kế API có thể mất cả do khó khăn trong việc giữ mã hoạt động; như đã nêu trước đó rất khó để làm tốt ). Trong Python 2, điều này có nghĩa là đảm bảo các API lấy văn bản có thể hoạt động với

try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
2 và những AP Python 2). Thông thường, vấn đề lớn nhất là nhận ra các phương pháp nào tồn tại trong các loại trong Python 2 & 3 đồng thời (đối với văn bản mà
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
2 trong Python 2 và
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 trong Python 3, đối với nhị phân mà ____ ____ 40/________ 20 trong Python 2 và
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 ở Python 3). Bảng sau liệt kê các phương thức duy nhất của từng loại dữ liệu trên Python 2 & 3 (ví dụ: phương pháp
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
2 có thể sử dụng trên loại dữ liệu nhị phân tương đương trong Python 2 hoặc 3, nhưng nó không thể được sử dụng bởi kiểu dữ liệu văn bản một cách nhất quán giữa Python 2 và 3 vì
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 trong Python 3 không có phương pháp). Xin lưu ý rằng như của Python 3.5, phương pháp
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
4 đã được thêm vào loại byte.highly recommended you don’t design APIs that can take both due to the difficulty of keeping the code working; as stated earlier it is difficult to do well). In Python 2 this means making sure the APIs that take text can work with
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
2 and those that work with binary data work with the
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 type from Python 3 (which is a subset of
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 in Python 2 and acts as an alias for
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 type in Python 2). Usually the biggest issue is realizing which methods exist on which types in Python 2 & 3 simultaneously (for text that’s
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
2 in Python 2 and
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 in Python 3, for binary that’s
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0/
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 in Python 2 and
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 in Python 3). The following table lists the unique methods of each data type across Python 2 & 3 (e.g., the
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
2 method is usable on the equivalent binary data type in either Python 2 or 3, but it can’t be used by the textual data type consistently between Python 2 and 3 because
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 in Python 3 doesn’t have the method). Do note that as of Python 3.5 the
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
4 method was added to the bytes type.

Dữ liệu văn bản

Dữ liệu nhị phân

giải mã

mã hóa

định dạng

isdecimal

Isnumeric

Làm cho sự khác biệt dễ dàng hơn để xử lý có thể được thực hiện bằng cách mã hóa và giải mã giữa dữ liệu nhị phân và văn bản ở rìa mã của bạn. Điều này có nghĩa là khi bạn nhận được văn bản trong dữ liệu nhị phân, bạn nên giải mã nó ngay lập tức. Và nếu mã của bạn cần gửi văn bản dưới dạng dữ liệu nhị phân thì mã hóa nó càng muộn càng tốt. Điều này cho phép mã của bạn làm việc chỉ với văn bản nội bộ và do đó loại bỏ việc phải theo dõi loại dữ liệu bạn đang làm việc.

Vấn đề tiếp theo là đảm bảo bạn biết liệu các chuỗi chữ trong mã của bạn đại diện cho văn bản hoặc dữ liệu nhị phân. Bạn nên thêm tiền tố

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
5 vào bất kỳ chữ nào trình bày dữ liệu nhị phân. Đối với văn bản, bạn nên thêm tiền tố
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
6 vào văn bản theo nghĩa đen. .

Là một phần của sự phân đôi này, bạn cũng cần cẩn thận về việc mở các tập tin. Trừ khi bạn đã làm việc trên Windows, có khả năng bạn không luôn bận tâm thêm chế độ

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
5 khi mở tệp nhị phân (ví dụ: python -m pip install coverage1 để đọc nhị phân). Theo Python 3, các tệp nhị phân và tệp văn bản rõ ràng là khác biệt và không tương thích lẫn nhau; Xem mô -đun python -m pip install coverage2 để biết chi tiết. Do đó, bạn phải đưa ra quyết định liệu một tệp sẽ được sử dụng để truy cập nhị phân (cho phép đọc dữ liệu nhị phân và/hoặc bằng văn bản) hoặc truy cập văn bản (cho phép dữ liệu văn bản được đọc và/hoặc viết). Bạn cũng nên sử dụng
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
1 để mở các tệp thay vì hàm
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
2 tích hợp vì mô-đun python -m pip install coverage2 phù hợp từ Python 2 đến 3 trong khi hàm
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
2 tích hợp không (trong Python 3, nó thực sự là
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
1). Đừng bận tâm đến việc sử dụng python -m pip install coverage8 lỗi thời vì điều đó chỉ cần thiết để giữ khả năng tương thích với Python 2.5.must make a decision of whether a file will be used for binary access (allowing binary data to be read and/or written) or textual access (allowing text data to be read and/or written). You should also use
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
1 for opening files instead of the built-in
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
2 function as the python -m pip install coverage2 module is consistent from Python 2 to 3 while the built-in
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
2 function is not (in Python 3 it’s actually
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
1). Do not bother with the outdated practice of using python -m pip install coverage8 as that’s only necessary for keeping compatibility with Python 2.5.

Các hàm tạo của cả

try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0 và
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 có ngữ nghĩa khác nhau cho cùng một đối số giữa Python 2 & 3. Chuyển số nguyên cho
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 trong Python 2 sẽ cung cấp cho bạn biểu diễn chuỗi của số nguyên: python -m pip install future2. Nhưng trong Python 3, một đối số số nguyên cho
import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc
0 sẽ cung cấp cho bạn một đối tượng byte miễn là số nguyên được chỉ định, chứa đầy các byte null: python -m pip install future4. Một lo lắng tương tự là cần thiết khi chuyển một đối tượng byte cho
try:
    from importlib import abc
except ImportError:
    from importlib2 import abc
0. Trong Python 2, bạn chỉ cần lấy lại đối tượng byte: python -m pip install future6. Nhưng trong Python 3, bạn nhận được biểu diễn chuỗi của đối tượng byte: python -m pip install future7.

Cuối cùng, việc lập chỉ mục dữ liệu nhị phân đòi hỏi phải xử lý cẩn thận (cắt không yêu cầu xử lý đặc biệt). Trong Python 2, python -m pip install future8 trong khi ở Python 3 python -m pip install future9. Bởi vì dữ liệu nhị phân chỉ đơn giản là một tập hợp các số nhị phân, Python 3 trả về giá trị số nguyên cho byte bạn chỉ mục. Nhưng trong Python 2 vì python -m pip install pylint0, việc lập chỉ mục trả về một lát byte một mục. Sáu dự án có một hàm có tên python -m pip install pylint1 sẽ trả về một số nguyên như trong Python 3: python -m pip install pylint2.not require any special handling). In Python 2, python -m pip install future8 while in Python 3 python -m pip install future9. Because binary data is simply a collection of binary numbers, Python 3 returns the integer value for the byte you index on. But in Python 2 because python -m pip install pylint0, indexing returns a one-item slice of bytes. The six project has a function named python -m pip install pylint1 which will return an integer like in Python 3: python -m pip install pylint2.

Để tóm tắt:

  1. Quyết định API của bạn lấy văn bản và lấy dữ liệu nhị phân nào

  2. Đảm bảo rằng mã của bạn hoạt động với văn bản cũng hoạt động với

    try:
        from importlib import abc
    except ImportError:
        from importlib2 import abc
    
    2 và mã cho dữ liệu nhị phân hoạt động với
    import sys
    
    if sys.version_info[0] == 3:
        from importlib import abc
    else:
        from importlib2 import abc
    
    0 trong Python 2 (xem bảng trên để biết các phương pháp bạn không thể sử dụng cho từng loại)

  3. Đánh dấu tất cả các văn bản nhị phân bằng tiền tố

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    5, chữ văn bản với tiền tố
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    6

  4. Giải mã dữ liệu nhị phân thành văn bản càng sớm càng tốt, mã hóa văn bản càng nhiều càng muộn càng tốt

  5. Mở các tệp bằng cách sử dụng

    import sys
    
    if sys.version_info[0] == 3:
        from importlib import abc
    else:
        from importlib2 import abc
    
    1 và đảm bảo chỉ định chế độ
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    5 khi thích hợp

  6. Hãy cẩn thận khi lập chỉ mục vào dữ liệu nhị phân

Sử dụng phát hiện tính năng thay vì phát hiện phiên bản

Chắc chắn bạn sẽ có mã phải chọn những việc cần làm dựa trên phiên bản Python đang chạy. Cách tốt nhất để làm điều này là phát hiện tính năng về việc liệu phiên bản Python mà bạn đang chạy theo hỗ trợ những gì bạn cần. Nếu vì một lý do nào đó mà không hoạt động thì bạn nên thực hiện kiểm tra phiên bản chống lại Python 2 chứ không phải Python 3. Để giúp giải thích điều này, hãy để xem một ví dụ.

Hãy cùng giả vờ rằng bạn cần truy cập vào một tính năng của python -m pip install pylint9 có sẵn trong Thư viện tiêu chuẩn Python, kể từ Python 3.3 và có sẵn cho Python 2 thông qua ImpretLib2 trên PYPI. Bạn có thể bị cám dỗ để ghi mã để truy cập, ví dụ: Mô -đun python -m pip install caniusepython30 bằng cách thực hiện như sau:

import sys

if sys.version_info[0] == 3:
    from importlib import abc
else:
    from importlib2 import abc

Vấn đề với mã này là những gì xảy ra khi Python 4 xuất hiện? Sẽ tốt hơn nếu coi Python 2 là trường hợp đặc biệt thay vì Python 3 và cho rằng các phiên bản Python trong tương lai sẽ tương thích với Python 3 hơn Python 2:

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc

Tuy nhiên, giải pháp tốt nhất là không phát hiện phiên bản và thay vào đó dựa vào phát hiện tính năng. Điều đó tránh mọi vấn đề tiềm ẩn trong việc phát hiện phiên bản sai và giúp bạn tương thích trong tương lai:

try:
    from importlib import abc
except ImportError:
    from importlib2 import abc

Ngăn chặn hồi quy khả năng tương thích

Khi bạn đã dịch hoàn toàn mã của mình để tương thích với Python 3, bạn sẽ muốn đảm bảo mã của bạn không hồi quy và ngừng hoạt động theo Python 3. Điều này đặc biệt đúng nếu bạn có sự phụ thuộc đang chặn bạn thực sự chạy theo Python 3 tại thời điểm này.

Để giúp duy trì tương thích, bất kỳ mô -đun mới nào bạn tạo nên có ít nhất là khối mã sau ở đầu của nó:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

Bạn cũng có thể chạy Python 2 bằng cờ python -m pip install caniusepython31 để được cảnh báo về các vấn đề tương thích khác nhau của bạn trong quá trình thực thi. Nếu bạn biến cảnh báo thành lỗi với python -m pip install caniusepython32 thì bạn có thể chắc chắn rằng bạn không vô tình bỏ lỡ cảnh báo.

Bạn cũng có thể sử dụng dự án pylint và cờ python -m pip install caniusepython33 của nó để xấp xỉ mã của bạn để nhận cảnh báo khi mã của bạn bắt đầu đi chệch khỏi khả năng tương thích của Python 3. Điều này cũng ngăn bạn không phải chạy hiện đại hóa hoặc tương lai qua mã của bạn thường xuyên để bắt các hồi quy tương thích. Điều này không yêu cầu bạn chỉ hỗ trợ Python 2.7 và Python 3.4 hoặc mới hơn vì đó là hỗ trợ phiên bản Python tối thiểu của Pylint.

Kiểm tra sự phụ thuộc nào chặn quá trình chuyển đổi của bạn

Sau khi bạn đã làm cho mã của mình tương thích với Python 3, bạn nên bắt đầu quan tâm đến việc liệu các phụ thuộc của bạn cũng đã được chuyển. Dự án Caniusepython3 được tạo để giúp bạn xác định dự án nào-trực tiếp hoặc gián tiếp-đang ngăn bạn hỗ trợ Python 3. Có cả công cụ dòng lệnh cũng như giao diện web tại https://caniusepython3.com. you have made your code compatible with Python 3 you should begin to care about whether your dependencies have also been ported. The caniusepython3 project was created to help you determine which projects – directly or indirectly – are blocking you from supporting Python 3. There is both a command-line tool as well as a web interface at https://caniusepython3.com.

Dự án cũng cung cấp mã mà bạn có thể tích hợp vào bộ thử nghiệm của mình để bạn sẽ có bài kiểm tra thất bại khi bạn không còn phụ thuộc chặn bạn sử dụng Python 3. Điều này cho phép bạn tránh phải kiểm tra thủ công các phụ thuộc của bạn và nhanh chóng được thông báo Khi bạn có thể bắt đầu chạy trên Python 3.

Cập nhật tệp conda create --name py3 python=3.5 6 của bạn để biểu thị khả năng tương thích của Python 3

Khi mã của bạn hoạt động theo Python 3, bạn nên cập nhật các trình phân loại trong

conda create --name py3 python=3.5
6 của mình để chứa python -m pip install caniusepython36 và để không chỉ định hỗ trợ Python 2 duy nhất. Điều này sẽ cho bất kỳ ai sử dụng mã của bạn rằng bạn hỗ trợ Python 2 và 3. Lý tưởng nhất là bạn cũng sẽ muốn thêm trình phân loại cho từng phiên bản chính/nhỏ của Python mà bạn hiện đang hỗ trợ.and 3. Ideally you will also want to add classifiers for each major/minor version of Python you now support.

Sử dụng tích hợp liên tục để duy trì tương thích Jor

Khi bạn có thể chạy hoàn toàn theo Python 3, bạn sẽ muốn đảm bảo mã của bạn luôn hoạt động theo cả Python 2 & 3. Có lẽ là công cụ tốt nhất để chạy thử nghiệm của bạn dưới nhiều phiên dịch viên Python là Tox. Sau đó, bạn có thể tích hợp TOX với hệ thống tích hợp liên tục của mình để bạn không bao giờ vô tình phá vỡ hỗ trợ Python 2 hoặc 3.

Bạn cũng có thể muốn sử dụng cờ python -m pip install caniusepython37 với trình thông dịch Python 3 để kích hoạt ngoại lệ khi bạn so sánh byte với các chuỗi hoặc byte với INT (sau này có sẵn bắt đầu trong Python 3.5). Theo mặc định, các so sánh khác nhau, chỉ cần trả về python -m pip install caniusepython38, nhưng nếu bạn đã phạm sai lầm trong việc tách xử lý dữ liệu văn bản/nhị phân hoặc lập chỉ mục trên byte, bạn sẽ dễ dàng tìm thấy lỗi. Cờ này sẽ gây ra một ngoại lệ khi các loại so sánh này xảy ra, làm cho sai lầm dễ dàng theo dõi hơn nhiều.

Và điều đó chủ yếu là nó! Tại thời điểm này, cơ sở mã của bạn tương thích với cả Python 2 và 3 đồng thời. Thử nghiệm của bạn cũng sẽ được thiết lập để bạn vô tình phá vỡ khả năng tương thích của Python 2 hoặc 3 bất kể bạn thường chạy thử nghiệm nào trong khi phát triển.

Cân nhắc sử dụng kiểm tra loại tĩnh tùy chọn

Một cách khác để giúp chuyển mã mã của bạn là sử dụng trình kiểm tra loại tĩnh như mypy hoặc pytype trên mã của bạn. Các công cụ này có thể được sử dụng để phân tích mã của bạn như thể nó đang được chạy theo Python 2, sau đó bạn có thể chạy công cụ lần thứ hai như thể mã của bạn đang chạy dưới Python 3. Bằng cách chạy trình kiểm tra loại tĩnh hai lần như thế này bạn có thể khám phá ra nếu Bạn ví dụ: Sử dụng sai loại dữ liệu nhị phân trong một phiên bản của Python so với một phiên bản khác. Nếu bạn thêm gợi ý loại tùy chọn vào mã của mình, bạn cũng có thể nêu rõ liệu API của bạn sử dụng dữ liệu văn bản hoặc nhị phân, giúp đảm bảo mọi thứ hoạt động như mong đợi trong cả hai phiên bản Python.

Làm cách nào để chuyển đổi giữa python3 và python2?

Chuyển đổi giữa môi trường Python 2 và Python 3..
Tạo môi trường Python 2 có tên PY2, cài đặt Python 2.7: ....
Tạo một môi trường mới có tên PY3, cài đặt Python 3.5: ....
Kích hoạt và sử dụng môi trường Python 2. ....
Vô hiệu hóa môi trường Python 2. ....
Kích hoạt và sử dụng môi trường Python 3 ..

Tôi có thể có cả Python 2 và Python 3 không?

Chúng ta có thể cài đặt cả Python 2 và Python 3 trên bất kỳ thiết bị Windows hoặc Linux nào. Chúng ta có thể tạo các môi trường khác nhau trên các IDE khác nhau để sử dụng các phiên bản riêng biệt hoặc sử dụng các cách sau để chạy chúng bằng dấu nhắc lệnh.. We can either create different environments on different IDEs to use the versions separately or use the following ways to run them using the command prompt.

Làm cách nào để chuyển sang Python 2.7 trên Windows?

Cách cài đặt Python 2.7 và 3.6 trong Windows 10 [Thêm đường dẫn Python]..
Tải xuống Python 2.7.Truy cập www.python.org/doads và nhấp vào 'Tải xuống Python 2.714.....
Cài đặt Python 2.7.Khi tải xuống hoàn tất bấm vào để cài đặt.....
Tải xuống Python3.....
Thêm đường dẫn Python27 và Python3.....
Thay đổi tên thực thi.....
Kiểm tra cả hai phiên bản Python ..

Làm cách nào để chạy hai phiên bản Python?

Trong bài viết này, bạn sẽ học cách:..
Cài đặt nhiều phiên bản Python ..
Cài đặt phiên bản phát triển mới nhất của Python ..
Chuyển đổi giữa các phiên bản đã cài đặt ..
Sử dụng môi trường ảo với pyenv ..
Kích hoạt các phiên bản Python và môi trường ảo khác nhau tự động ..