Chạy mã Python 2 trong Python 3

Tôi đang cố gắng đưa một số mã Python 2 vào Python 3 nhưng gặp sự cố khi quy trình hoạt động chính xác. Từ ArcGIS Pro, tôi đang chạy một công cụ GP tùy chỉnh với đoạn mã sau làm tập lệnh của nó. Mục tiêu của tôi là chạy mã Python 2 [được lưu trữ trong một tập lệnh riêng] dựa trên một loạt MXD để liệt kê nguồn dữ liệu cho từng lớp hoặc bảng. Trong trường hợp của tôi, làm theo cách này không mang lại kết quả. Mã chạy trong khoảng 2 giây rồi chấm dứt. Bất kỳ ý tưởng?

KỊCH BẢN PYTHON 3 [WAPPER]

nhập quy trình con, os, winreg, sys, arcpy

thử.
   arcpy. AddMessage["Tìm Python 2. 7 thư mục cài đặt. "]
   hKey = winreg. OpenKey [winreg. HKEY_LOCAL_MACHINE,    "SOFTWARE\\WOW6432Node\\Python\\PythonCore\\2. 7\\InstallPath"]
   result = winreg. QueryValueEx[hKey, ""][0]
ngoại trừ.
   arcpy. AddWarning["Trăn 2. 7 không tìm thấy thư mục cài đặt. "]
   arcpy. AddError["Tập lệnh thất bại. "]
   sys. thoát[]

nếu hệ điều hành. con đường. tồn tại [kết quả + "\\python. exe"].
   arcpy. AddMessage["Khởi chạy Python 2. 7 thực thi. "]
   CREATE_NO_WINDOW = 0x8000000
    process = sub process. Popen[[kết quả + "\\python. exe", "C. \\temp\\python\\ListMXDDataSources. py"],    stdout=quy trình con. PIPE, stderr=quy trình con. PIPE, Creationflags = CREATE_NO_WINDOW, shell=True, stdin=None]
   stdout, stderr = process. giao tiếp[]
   arcpy. Thêm tin nhắn['{}'. định dạng [thiết bị xuất chuẩn. decode["utf-8"]]]
   arcpy. AddWarning['{}'. định dạng [stderr. giải mã ["utf-8"]]]

KỊCH BẢN PYTHON 2

nhập arcpy, toàn cầu

rootDirectory = 'C. /temp'
fileExtension = '. mxd'

def main[].
   cho f trên toàn cầu. toàn cầu [rootDirectory + '/*' + fileExtension].
      mxd = arcpy. lập bản đồ. MapDocument[f]
      cho df trong arcpy. lập bản đồ. ListDataFrames[mxd, ''].
         cho lyr trong arcpy. lập bản đồ. ListLayers[mxd, '', df].
             nếu không lyr. isGroupLayer.
               if lyr. làRasterLayer.
                  print "Lớp quét, {}". định dạng[lyr]
               elif lyr. isFeatureLayer.
                  print "Lớp đối tượng, {}, {}". định dạng [lyr, lyr. serviceProperties]
               else.
                  print "Layer, {}". định dạng[lyr]
          cho tbl trong arcpy. lập bản đồ. ListTableViews[mxd, '', df].
            in "Bảng, {}". định dạng [tbl. nguồn dữ liệu]

if __name__ == '__main__'.
   main[]

Việc chọn sử dụng bộ xử lý Python 2 hoặc Python 3 được thực hiện tùy theo từng trường hợp. Trong trường hợp có thể sử dụng mặc định, chẳng hạn như trong cú pháp lệnh, thì mặc định là sử dụng bộ xử lý Python 2. Trong mọi trường hợp, bạn có thể chỉ định rõ ràng để sử dụng bộ xử lý Python 3

2to3 là ​​một chương trình Python đọc Python 2. x và áp dụng một loạt trình sửa lỗi để biến nó thành Python 3 hợp lệ. mã x. Thư viện tiêu chuẩn chứa một bộ sửa lỗi phong phú sẽ xử lý hầu hết tất cả mã. Tuy nhiên, thư viện hỗ trợ 2to3 là ​​một thư viện linh hoạt và chung chung, vì vậy bạn có thể viết các trình sửa lỗi của riêng mình cho 2to3

Không dùng nữa kể từ phiên bản 3. 11, sẽ bị xóa trong phiên bản 3. 13. Mô-đun

$ 2to3 example.py
1 được đánh dấu là đang chờ ngừng sử dụng trong Python 3. 9 [tăng khi nhập] và hoàn toàn không dùng nữa trong Python 3. 11 [tăng ]. Công cụ
$ 2to3 example.py
5 là một phần của điều đó. Nó sẽ bị xóa trong Python 3. 13.

Sử dụng 2to3

2to3 thường sẽ được cài đặt với trình thông dịch Python dưới dạng tập lệnh. Nó cũng nằm trong thư mục

$ 2to3 example.py
6 của thư mục gốc Python

Các đối số cơ bản của 2to3 là ​​danh sách các tệp hoặc thư mục cần chuyển đổi. Các thư mục được duyệt qua đệ quy cho các nguồn Python

Đây là một mẫu Python 2. tệp nguồn x,

$ 2to3 example.py
7

def greet[name]:
    print "Hello, {0}!".format[name]
print "What's your name?"
name = raw_input[]
greet[name]

Nó có thể được chuyển đổi thành Python 3. xcode qua 2 đến 3 trên dòng lệnh

$ 2to3 example.py

Một sự khác biệt so với tệp nguồn ban đầu được in. 2to3 cũng có thể ghi ngay các sửa đổi cần thiết vào tệp nguồn. [Một bản sao lưu của tệp gốc được thực hiện trừ khi cũng cung cấp

$ 2to3 example.py
8. ] Ghi lại các thay đổi được kích hoạt với cờ
$ 2to3 example.py
9

________số 8

Sau khi chuyển đổi,

$ 2to3 example.py
7 trông như thế này

$ 2to3 example.py
0

Nhận xét và thụt đầu dòng chính xác được giữ nguyên trong suốt quá trình dịch thuật

Theo mặc định, 2to3 chạy một bộ. Cờ

$ 2to3 -w example.py
1 liệt kê tất cả các trình sửa lỗi có sẵn. Có thể cung cấp một bộ trình sửa lỗi rõ ràng để chạy với
$ 2to3 -w example.py
2. Tương tự như vậy,
$ 2to3 -w example.py
3 vô hiệu hóa một cách rõ ràng trình sửa lỗi. Ví dụ sau chỉ chạy bộ sửa lỗi
$ 2to3 -w example.py
4 và
$ 2to3 -w example.py
5

$ 2to3 example.py
6

Lệnh này chạy mọi trình sửa lỗi ngoại trừ trình sửa lỗi

$ 2to3 -w example.py
6

$ 2to3 example.py
8

Một số trình sửa lỗi rõ ràng, nghĩa là chúng không được chạy theo mặc định và phải được liệt kê trên dòng lệnh để được chạy. Tại đây, ngoài các trình sửa lỗi mặc định, trình sửa lỗi

$ 2to3 -w example.py
7 được chạy

$ 2to3 example.py
0

Lưu ý cách chuyển

$ 2to3 -w example.py
8 cho phép tất cả các trình sửa lỗi mặc định

Đôi khi 2to3 sẽ tìm thấy một chỗ trong mã nguồn của bạn cần thay đổi, nhưng 2to3 không thể tự động sửa. Trong trường hợp này, 2to3 sẽ in cảnh báo bên dưới diff cho một tệp. Bạn nên giải quyết cảnh báo để tuân thủ 3. mã x

2to3 cũng có thể cấu trúc lại doctests. Để bật chế độ này, hãy sử dụng cờ

$ 2to3 -w example.py
9. Lưu ý rằng chỉ doctests sẽ được cấu trúc lại. Điều này cũng không yêu cầu mô-đun phải là Python hợp lệ. Ví dụ: các ví dụ giống như doctest trong tài liệu reST cũng có thể được cấu trúc lại với tùy chọn này

Tùy chọn

$ 2to3 example.py
00 cho phép xuất ra nhiều thông tin hơn về quá trình dịch thuật

Vì một số câu lệnh in có thể được phân tích thành lời gọi hàm hoặc câu lệnh, 2to3 không phải lúc nào cũng có thể đọc các tệp chứa hàm in. Khi 2to3 phát hiện sự hiện diện của chỉ thị trình biên dịch

$ 2to3 example.py
01, nó sẽ sửa đổi ngữ pháp bên trong của nó để diễn giải thành một hàm. Thay đổi này cũng có thể được kích hoạt thủ công với cờ
$ 2to3 example.py
03. Sử dụng
$ 2to3 example.py
03 để chạy trình sửa lỗi trên mã đã chuyển đổi câu lệnh in của nó. Cũng có thể sử dụng
$ 2to3 example.py
05 để tạo hàm

Tùy chọn

$ 2to3 example.py
07 hoặc
$ 2to3 example.py
08 cho phép đặc điểm kỹ thuật của một thư mục thay thế cho các tệp đầu ra đã xử lý được ghi vào. Cờ
$ 2to3 example.py
8 là bắt buộc khi sử dụng cờ này vì các tệp sao lưu không có ý nghĩa khi không ghi đè lên các tệp đầu vào

Mới trong phiên bản 3. 2. 3. Tùy chọn

$ 2to3 example.py
07 đã được thêm vào.

Cờ

$ 2to3 example.py
61 hoặc
$ 2to3 example.py
62 yêu cầu 2to3 luôn ghi tệp đầu ra ngay cả khi tệp không cần thay đổi. Điều này hữu ích nhất với
$ 2to3 example.py
07 để toàn bộ cây nguồn Python được sao chép với bản dịch từ thư mục này sang thư mục khác. Tùy chọn này ngụ ý cờ
$ 2to3 example.py
9 vì nó sẽ không có ý nghĩa gì khác

Mới trong phiên bản 3. 2. 3. Cờ

$ 2to3 example.py
61 đã được thêm vào.

Tùy chọn

$ 2to3 example.py
66 chỉ định một chuỗi để nối vào tất cả các tên tệp đầu ra. Cần có cờ
$ 2to3 example.py
8 khi chỉ định điều này vì không cần sao lưu khi ghi vào các tên tệp khác nhau. Ví dụ

$ 2to3 example.py
9

Sẽ khiến một tệp đã chuyển đổi có tên

$ 2to3 example.py
68 được ghi

Mới trong phiên bản 3. 2. 3. Tùy chọn

$ 2to3 example.py
66 đã được thêm vào.

Để dịch toàn bộ dự án từ cây thư mục này sang cây thư mục khác, hãy sử dụng

def greet[name]:
    print "Hello, {0}!".format[name]
print "What's your name?"
name = raw_input[]
greet[name]
2

người sửa chữa

Mỗi bước chuyển đổi mã được gói gọn trong một trình sửa lỗi. Lệnh

$ 2to3 example.py
80 liệt kê chúng. Vì, mỗi cái có thể được bật và tắt riêng lẻ. Chúng được mô tả ở đây chi tiết hơn

áp dụng

Loại bỏ việc sử dụng

$ 2to3 example.py
81. Ví dụ:
$ 2to3 example.py
82 được chuyển đổi thành
$ 2to3 example.py
83

khẳng định

Thay thế tên phương thức không dùng nữa bằng tên chính xác

Từ

Đến

$ 2to3 example.py
85

$ 2to3 example.py
87

$ 2to3 example.py
89

$ 2to3 example.py
01

$ 2to3 example.py
03

$ 2to3 example.py
05

$ 2to3 example.py
07

$ 2to3 example.py
09

$ 2to3 example.py
91

$ 2to3 example.py
93

$ 2to3 example.py
95

$ 2to3 example.py
97

dây cơ sở

Chuyển đổi

$ 2to3 example.py
99 thành

đệm

Chuyển đổi

def greet[name]:
    print "Hello, {0}!".format[name]
print "What's your name?"
name = raw_input[]
greet[name]
21 thành. Trình sửa lỗi này là tùy chọn vì API tương tự nhưng không hoàn toàn giống với của
def greet[name]:
    print "Hello, {0}!".format[name]
print "What's your name?"
name = raw_input[]
greet[name]
21

mệnh lệnh

Sửa các phương pháp lặp lại từ điển.

def greet[name]:
    print "Hello, {0}!".format[name]
print "What's your name?"
name = raw_input[]
greet[name]
25 được chuyển thành ,
def greet[name]:
    print "Hello, {0}!".format[name]
print "What's your name?"
name = raw_input[]
greet[name]
27 thành , và
def greet[name]:
    print "Hello, {0}!".format[name]
print "What's your name?"
name = raw_input[]
greet[name]
29 thành. Tương tự,
$ 2to3 example.py
51,
$ 2to3 example.py
52 và
$ 2to3 example.py
53 lần lượt được chuyển đổi thành , và. Nó cũng kết thúc các cách sử dụng hiện có của , và trong một cuộc gọi đến

ngoại trừ

Chuyển đổi

$ 2to3 example.py
01 thành
$ 2to3 example.py
02

giám đốc điều hành

Chuyển đổi câu lệnh

$ 2to3 example.py
03 thành hàm

tập tin thực thi

Loại bỏ việc sử dụng

$ 2to3 example.py
05. Đối số của
$ 2to3 example.py
05 được gói gọn trong các lời gọi đến , , và

lối ra

Thay đổi nhiệm vụ của

$ 2to3 example.py
10 để sử dụng mô-đun

lọc

Kết thúc việc sử dụng trong một cuộc gọi

vui vẻ

Sửa các thuộc tính chức năng đã được đổi tên. Ví dụ:

$ 2to3 example.py
14 được chuyển đổi thành
$ 2to3 example.py
15

Tương lai

Loại bỏ câu lệnh

$ 2to3 example.py
16

getcwdu

Đổi tên

$ 2to3 example.py
17 thành

has_key

Thay đổi

$ 2to3 example.py
19 thành
$ 2to3 example.py
20

thành ngữ

Trình sửa lỗi tùy chọn này thực hiện một số phép biến đổi làm cho mã Python trở nên đặc ngữ hơn. Loại so sánh như

$ 2to3 example.py
21 và
$ 2to3 example.py
22 được chuyển đổi thành
$ 2to3 example.py
23.
$ 2to3 example.py
24 trở thành
$ 2to3 example.py
25. Trình sửa lỗi này cũng cố gắng sử dụng ở những nơi thích hợp. Ví dụ, khối này

$ 2to3 example.py
5

được đổi thành

$ 2to3 example.py
0

nhập khẩu

Phát hiện nhập khẩu anh chị em và chuyển đổi chúng thành nhập khẩu tương đối

nhập khẩu

Xử lý đổi tên mô-đun trong thư viện chuẩn

nhập khẩu2

Xử lý đổi tên các mô-đun khác trong thư viện chuẩn. Nó tách biệt với trình sửa lỗi chỉ vì những hạn chế kỹ thuật

đầu vào

Chuyển đổi

$ 2to3 example.py
28 thành
$ 2to3 example.py
29

thực tập sinh

Chuyển đổi

$ 2to3 example.py
30 thành

chẳng hạn

Sửa các loại trùng lặp trong đối số thứ hai của. Ví dụ:

$ 2to3 example.py
33 được chuyển đổi thành
$ 2to3 example.py
34 và
$ 2to3 example.py
35 được chuyển đổi thành
$ 2to3 example.py
36

itertools_imports

Xóa nhập khẩu của

$ 2to3 example.py
37,
$ 2to3 example.py
38 và
$ 2to3 example.py
39. Nhập khẩu của
$ 2to3 example.py
40 cũng được thay đổi thành

itertools

Thay đổi cách sử dụng của

$ 2to3 example.py
37,
$ 2to3 example.py
38 và
$ 2to3 example.py
39 thành tương đương được tích hợp sẵn của chúng.
$ 2to3 example.py
40 được đổi thành

Dài

Đổi tên

$ 2to3 example.py
47 thành

bản đồ

Kết thúc cuộc gọi. Nó cũng thay đổi

$ 2to3 example.py
51 thành
$ 2to3 example.py
52. Sử dụng
$ 2to3 example.py
53 sẽ vô hiệu hóa trình sửa lỗi này

siêu lớp

Chuyển đổi cú pháp siêu lớp cũ [

$ 2to3 example.py
54 trong nội dung lớp] thành cú pháp mới [
$ 2to3 example.py
55]

phương phápattrs

Sửa tên thuộc tính phương thức cũ. Ví dụ,

$ 2to3 example.py
56 được chuyển đổi thành
$ 2to3 example.py
57

ne

Chuyển đổi cú pháp không bằng cũ,

$ 2to3 example.py
58, thành
$ 2to3 example.py
59

tiếp theo

Chuyển đổi việc sử dụng các phương thức

$ 2to3 example.py
60 của iterator thành hàm. Nó cũng đổi tên các phương thức thành

khác không

Đổi tên các định nghĩa của các phương thức được gọi là

$ 2to3 example.py
64 thành

chữ số

Chuyển đổi các ký tự bát phân thành cú pháp mới

nhà điều hành

Chuyển đổi các cuộc gọi đến các chức năng khác nhau trong mô-đun thành các cuộc gọi chức năng khác nhưng tương đương. Khi cần, các câu lệnh

$ 2to3 example.py
67 thích hợp được thêm vào, e. g.
$ 2to3 example.py
68. Các ánh xạ sau đây được thực hiện

Từ

Đến

$ 2to3 example.py
69

$ 2to3 example.py
70

$ 2to3 example.py
71

$ 2to3 example.py
72

$ 2to3 example.py
73

$ 2to3 example.py
74

$ 2to3 example.py
75

$ 2to3 example.py
76

$ 2to3 example.py
77

$ 2to3 example.py
78

$ 2to3 example.py
79

$ 2to3 example.py
80

$ 2to3 example.py
81

$ 2to3 example.py
82

paren

Thêm dấu ngoặc đơn bổ sung khi chúng được yêu cầu trong việc hiểu danh sách. Ví dụ,

$ 2to3 example.py
83 trở thành
$ 2to3 example.py
84

in

Chuyển đổi câu lệnh

$ 2to3 example.py
85 thành hàm

Quyên góp

Chuyển đổi

$ 2to3 example.py
87 thành
$ 2to3 example.py
88 và
$ 2to3 example.py
89 thành
$ 2to3 example.py
90. Nếu
$ 2to3 example.py
91 là một bộ, bản dịch sẽ không chính xác vì việc thay thế các bộ cho các ngoại lệ đã bị loại bỏ trong 3. 0

Bạn có thể sử dụng Python 2 trong Python 3 không?

Python phiên bản 3 không tương thích ngược với Python 2 . Nhiều nhà phát triển gần đây đang tạo các thư viện mà bạn chỉ có thể sử dụng với Python 3. Nhiều thư viện cũ hơn được tạo cho Python 2 không tương thích với chuyển tiếp.

Python 3 có tương thích ngược với Python 2 không?

Python 3 không tương thích ngược với Python 2 nên mã của bạn có thể cần được điều chỉnh. Vui lòng bắt đầu di chuyển mã Python 2 hiện tại của bạn sang Python 3. Sê-ri Python 2 End Of Life được đặt thành ngày 1 tháng 1 năm 2020.

Chủ Đề