Chuyển từ trăn 2 sang 3

Bản nâng cấp Python lớn cuối cùng — lên phiên bản 3 — đã đến vào tháng 12. 2008, cách đây gần 12 năm. Tuy nhiên, rất có thể bạn vẫn đang làm việc trên mã thử nghiệm hoặc sản phẩm Python 2. Nếu đúng như vậy thì bạn có thể thấy thông báo ngừng sử dụng bên dưới như một lời nhắc cập nhật phiên bản Python mà bạn đang làm việc

“DEPRECATION. Python 2. 7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2. 7 won’t be maintained after that date. A future version of pip will drop support for Python 2. 7. ”

Please take this seriously and plan accordingly. Python updates to 3. x are not backward compatible. What you write with Python 2. x versions may not function properly when using 3. x.

Be sure to also read the fine print. According to the website for the programming language, the final Python upgrade release date is still TBD. “Being the last of the 2. x series, 2. 7 will receive bugfix support until 2020. Support officially stops January 1 2020, but the final release will occur after that date. ” [1]

So, Python 2 is entering into unsupported mode by the end of this year. If you haven’t yet done so, now is a good time to migrate the current Python 2 code to Python 3 syntax and stick to Python 3 going forward

Why don’t teams just jump start on this migration? One of the major hurdles is that the majority of working code simply breaks [read more at why-was-python-3-made-incompatible-with-python-2], either because of the direct language syntax or issues with third party APIs. Let’s be fair here. few of us would bother with migration if the new Python updates were backwards compatible. Instead, version 2 will go unsupported, forcing many — including us here at Couchbase — to prioritize migration. Even if the team crosses the bug fix support deadline, it’s ok [because your code is still working]. As a team, we decided it’s better to migrate as close to this date as possible so that we are on the same page with other Python community members and learn alongside them.   

This document is a collection of tips and tricks we learned while upgrading to Python 3 along with common problems we encountered during the Couchbase test infra migration process. As you’ll see we manually update python by command line after kick-starting with an automated process. Your approach may be different. Regardless, start as soon as you can. Updating python from version 2 to version 3 is important

Couchbase is an open source Enterprise-class MultiCloud to Edge NoSQL Database. The Couchbase functional testing framework, TestRunner has been developed in Python 2. The TestRunner git  repository can be found at https. //github. com/couchbase/testrunner .   Our goal now is to completely switch to Python 3 runtime instead of co-running with both Python 3 and Python 2.

As part of the Python upgrade process, we have identified the major changes needed to successfully port to version 3. Some of the problems you’ll read about we identified during the porting process. Our aim in sharing our learnings is to help you with your own migration. You can pick the latest Python 3. x [tùy thuộc vào phiên bản phát hành trước, ổn định, sửa lỗi bảo mật trên một nền tảng cụ thể, 3. 7 hoặc 3. 6], cái mà chúng tôi gọi là Python 3 xuyên suốt blog này. Xem thêm chi tiết về bản phát hành tại Tải xuống bản phát hành Python và  Tài liệu về Python 3.

Bảng gian lận

 

Sự thay đổi chính. Trăn 2 so với. Trăn 3

Để có ý tưởng về các thay đổi chính, đây là danh sách tóm tắt các thay đổi mã cần thiết từ Python 2 sang Python 3

Python 2Python 3 Văn bản utf-8. str
Văn bản là unicode. str
u”Nhị phân giống như Văn bản. byte/str
Ví dụ.
tệp. read[6] == ‘GIF89a’Dữ liệu nhị phân được biểu diễn dưới dạng tiền tố b. byte
 b”
Sử dụng giải mã[] để lấy chuỗi, mã hóa[] để lấy byte. Ví dụ.
tệp. read[6] == b’GIF89a’
b’hello’. decode[] → ‘xin chào’
‘xin chào’. encode[] → b'hello'
str[b'hello'] → “b'hello'In . in ‘ ‘
Example: print ‘ ‘Chức năng in
Ví dụ. print[‘ ‘]Phép chia số nguyên
Ví dụ. 5/2=2Phân chia tầng. Sử dụng 2 dấu gạch chéo
Ví dụ. 5/2 = 2 và 5/2=2. 5Phân chia số float
Ví dụ. 2/5. 0 = 2. 5 hoặc 5. 0/2 = 2. 5Phân chia phao. Sử dụng dấu gạch chéo đơn
Ví dụ. 5/2 = 2. 5Loại dài khác với int
long Không có loại dài. Nó giống như intxrange[]range[]Hàm lặp có tiền tố iter. iterxxx[]
Ví dụ. iteritems[]Đã bỏ tiền tố iter. xxxx[]
Ví dụ. items[]Danh sách được tải trực tiếp [tất cả các phần tử được tải vào bộ nhớ khi sử dụng danh sách]
Ví dụ. for i in [] Danh sách được tải chậm [khi một phần tử được truy cập, sau đó chỉ được tải vào bộ nhớ]
Ví dụ. for i in list[[]] Từ điển có thể được so sánh theo mặc định hoặc so sánh với 2 dict.
Ví dụ. sorted[dict] Không thể so sánh trực tiếp từ điển. sorted[] nên có khóa.

Ví dụ. đã sắp xếp[expected_result,key=[lambda x. x[xô. name][‘name’]]]Để so sánh chính tả/danh sách chung, bạn có thể sử dụng bên dưới.
 từ deepdiff nhập DeepDiff
 diffs = DeepDiff[actual_result['results'],expected_result[‘results’], ignore_order=True]if diffs:
   bản thân. khẳng địnhTrue[ Sai , khác]

Byte và chuỗi dưới dạng giá trị.
diffs = DeepDiff[set[actual_indexes], set[indexes_names], ignore_order=True, ignore_string_type_changes=True]

chuỗi. thay thế[dữ liệu[i],…]dữ liệu[i]. thay thế[. ]urllib. urlencode[]Mô-đun mới
  • http. khách hàng
  • urllib. yêu cầu, urllib. lỗi, urllib. phân tích cú pháp
  • sgmllib3k

Ví dụ.
urllib. phân tích cú pháp. urlencode[]

string.lowercaseAttributes:
string.ascii_lowercase
string.ascii_uppercase

Xem các cam kết py3 của testrunner  để biết các thay đổi

Cài đặt Python 3

Để thiết lập Python 3 từ đầu, hãy chạy các lệnh bên dưới trên máy chủ mới có các nền tảng chính được hỗ trợ.
Sau này trong thời gian chạy, hãy sử dụng lệnh python 3 hoặc python trong python 3 virtual env. Sử dụng pip3 hoặc pip3. x [pip3. 6 chẳng hạn] để cài đặt các gói dựa trên phiên bản Python 3 đã cài đặt.

hệ điều hành Mac

[Thí dụ. Máy tính xách tay của bạn]

CentOS

[ Nút ví dụ. Nô lệ của Jenkins]

Ubuntu Slave sử dụng để xác minh thời gian chạy Python 3Windows Thiết lập trực tiếp [pip3 được cài đặt tự động].

[https. //wsvincent. com/install-python3-mac/]

con trăn

1

brew cài đặt python3

Thiết lập môi trường ảo

Vỏ bọc

1

2

3

4

5

6

7

8

$ pip3 cài đặt virtualenv

$ mkdir ~/môi trường

$ virtualenv -p python3 ~/environments

$ nguồn ~/môi trường/bin/activate

[môi trường] jmunta-mac:~ jagadeshmunta

$ trăn -V

Trăn 3. 7. 3

[môi trường] jmunta-mac:~ jagadeshmunta

Cài đặt các thư viện cần thiết

Vỏ bọc

1

2

3

4

5

6

7

8

9

$ pip3 cài đặt couchbase

$ pip3 cài đặt sgmllib3k

$ pip3 cài đặt paramiko

$ pip3 cài đặt httplib2

$ pip3 cài đặt pyyaml

$ pip3 cài đặt Geohash

$ pip3 cài đặt python-geohash

$ pip3 cài đặt deepdiff

$ pip3 cài đặt pyes

Hiện tại, sửa đổi bên dưới là bắt buộc đối với ứng dụng khách Python 3 http phổ biến, nếu không, bạn sẽ gặp lỗi

Vỏ bọc

1

2

3

$ vi /usr/lib64/python3.6/http/ứng dụng khách . py.py   

đoạn đến đoạn. mã hóa[] trong tương tự . the below:

1078                     chunk = f'{len[chunk]:X}\r\n'. mã hóa['ascii'] + chunk.encode[] \

 

Thiết lập trực tiếp và môi trường ảo

Vỏ bọc

1

2

3

4

5

6

7

8

9

10

11

12

13

# yum -y cài đặt https. // centos7. cộng đồng ius. org/ius-phát hành. vòng/phút

# danh sách yum có sẵn > /tmp/available_pkgs. txt

# con mèo /tmp/available_pkgs. txt. egrep python3

# yum -y cài đặt python36u

#trăn3. 6 --phiên bản

# yum -y cài đặt python36u-pip

# yum -y cài đặt python36u-devel

#trăn3. 6 -V

# mkdir ~/môi trường

# cd ~/môi trường/

#trăn3. 6 -m venv my_env

# nguồn ~/môi trường/my_env/bin/kích hoạt

#trăn -V

Cài đặt các thư viện cần thiết

Vỏ bọc

1

2

3

4

5

6

7

8

9

10

#píp3. 6 yêu cầu cài đặt

#píp3. 6 cài đặt sgmllib3k

#píp3. 6 cài đặt tham số

#píp3. 6 cài đặt httplib2

#píp3. 6 cài đặt pyyaml

#píp3. 6 cài đặt pytz

#píp3. 6 cài đặt Geohash

#píp3. 6 cài đặt python-geohash

#píp3. 6 cài đặt deepdiff

#píp3. 6 cài đặt pyes

 

Thực hiện cài đặt Couchbase CSDK và Python SDK trên nô lệ mới

Vỏ bọc

1

2

3

4

5

# yum -y cài đặt wget git

# quên http. //gói. đế đi văng. com/releases/couchbase-release/couchbase-release-1. 0-6-x86_64. vòng/phút

# rpm -iv couchbase-release-1. 0-6-x86_64. vòng/phút

# yum cài đặt libcouchbase-devel libcouchbase2-bin gcc gcc-C++

#píp3. 6 cài đặt couchbase

Hiện tại, sửa đổi bên dưới là bắt buộc đối với ứng dụng khách Python 3 http phổ biến, nếu không, bạn sẽ gặp lỗi

Vỏ bọc

1

2

3

$ vi /usr/lib64/python3.6/http/ứng dụng khách . py.py   

đoạn đến đoạn. mã hóa[] trong tương tự . the below:

1078                     chunk = f'{len[chunk]:X}\r\n'. mã hóa['ascii'] + chunk.encode[] \

 

Thiết lập trực tiếp

Vỏ bọc

1

# apt cài đặt python3-pip

 

Cài đặt các thư viện cần thiết

Vỏ bọc

1

2

3

4

5

6

7

8

9

# pip3 cài đặt sgmllib3k

# pip3 cài đặt tham số

# pip3 cài đặt httplib2

# pip3 cài đặt pyyaml

# pip3 cài đặt pytz [LƯU Ý. được sử dụng bởi các bài kiểm tra xdcr]

# pip3 cài đặt Geohash

# pip3 cài đặt python-geohash

# pip3 cài đặt deepdiff

# pip3 cài đặt pyes

Cài đặt cài đặt CSDK và Python SDK. [Tham khảo.  https. // tài liệu. đế đi văng. com/c-sdk/2. 10/bắt đầu sử dụng-sdk. html ]

Vỏ bọc

1

2

3

4

5

6

7

8

# quên -O- http. //gói. đế đi văng. com/ubuntu/couchbase. Chìa khóa. sudo apt-key thêm -

# con mèo/etc/apt/nguồn. danh sách. d/couchbase. danh sách

deb [ arch=amd64 ] http://gói. đế đi văng. com/bản phát hành/couchbase-server/enterprise/deb/ bionic bionic/main

deb [ arch=amd64 ] http. //packages. đế đi văng. com/bản phát hành/couchbase-server/community/deb/ bionic bionic/main

deb http. //gói. đế đi văng. com/ubuntu bionic bionic/main 

# cập nhật apt-get

#  apt-get install libcouchbase-dev libcouchbase2-bin build-essential

#  pip3 cài đặt couchbase

Hiện tại, sửa đổi bên dưới là bắt buộc đối với ứng dụng khách Python 3 http phổ biến, nếu không, bạn sẽ gặp lỗi

Vỏ bọc

1

2

3

$ vi /usr/lib64/python3.6/http/ứng dụng khách . py.py   

đoạn đến đoạn. mã hóa[] trong tương tự . the below:

1078                     chunk = f'{len[chunk]:X}\r\n'. mã hóa['ascii'] + chunk.encode[] \

 

Tải xuống và cài đặt. https. //www. con trăn. org/ftp/trăn/3. 7. 4/trăn-3. 7. 4. exe

PowerShell

1

2

3

4

C. \Python\Python37- . >python.exe -VPython 3 . 7 . 4

D. \py3porting\testrunner> . set PATH=C:\Python\Python37- . ;C:\Python\Python37-\Scripts;%PATH%

D. \py3porting\testrunner>pip3 -V

pip 19 . 0 . 3 từ c. \python\python37- . \lib\site-packages\pip [python 3. 7 ]

Cài đặt các thư viện cần thiết

PowerShell

1

2

3

4

5

6

7

8

9

pip3 cài đặt libcouchbase

pip3 cài đặt sgmllib3k

pip3 cài đặt paramiko

pip3 cài đặt httplib2

pip3 cài đặt pyyaml

pip3 cài đặt Geohash

pip3 cài đặt python-geohash

pip3 cài đặt deepdiff

pip3 cài đặt pyes

 

quá trình chuyển

Ở cấp độ cao, quá trình chuyển là một quy trình gồm ba bước. 1] Chuyển đổi tự động 2] Thay đổi thủ công 3] Xác thực và sửa lỗi trong thời gian chạy

Lúc đầu, sao chép kho lưu trữ gốc và có các thay đổi chuyển đổi tự động cơ bản. Kiểm tra các thay đổi dưới dạng kho lưu trữ mới cho đến khi hoàn tất chuyển đổi hoàn toàn. Bằng cách này, các chu kỳ hồi quy hiện tại có thể diễn ra liên tục

1. chuyển đổi tự động

Có một công cụ tự động được gọi là công cụ 2to3 tool do nhóm Python 3 cung cấp để trợ giúp .

Bạn có thể bắt đầu với một thư mục duy nhất trong không gian làm việc được nhân bản cục bộ để kiểm tra lại. Sau đó, việc chuyển đổi có thể được thực hiện hoàn toàn trên toàn bộ mã để quá trình chuyển đổi cơ bản được thực hiện

Dưới đây là một số lệnh chuyển đổi 2to3 mẫu trên MacOS. In the last command, note that all idioms were applied. Bằng cách này, lần chuyển đổi đầu tiên có thể xử lý các thay đổi chính

Vỏ bọc

1

2

3

4

5

6

[myenv] jmunta-mac:myscripts jagadeshmunta$ 2to3 . -o mới -n . -w .

hq-mac. testrunner jagadeshmunta$ cd lib . ; mv lib/couchbase_helper .. /couchbase_helper

hq-mac. testrunner jagadeshmunta$ 2to3 - . f all -f buffer -f idioms -f set_literal -f ws_comma  -n -o ~/p3testrunner_3 -w . . tee ~/2to3_3. txt

hq-mac. người chạy thử nghiệm jagadeshmunta$ thời gian 2to3 . -f all -f buffer -f idioms -f set_literal -f ws_comma  -n -w . . tee ~/2to3_4. txt

$ 2 ăn 3 -f tất cả -f buffer -f idioms -f set_literal -f ws_comma  -n -o ~/p3testrunner_helper -w .. /couchbase_helper . tee ~/2to3_helper. txt

cp -R ~/p3testrunner_helper/* .

 

2. Thay đổi thủ công

Chuyển đổi tự động không thực hiện chuyển hoàn chỉnh. Các sự cố phổ biến dưới đây có thể gặp phải trong quá trình chuyển đổi so với các thay đổi cú pháp phổ biến được thực hiện bởi công cụ 2to3 chuyển đổi tự động.  

Chạy lớp kiểm tra và xem có lỗi nào không và sửa một cách thích hợp, quyết định chuyển từ byte sang str hoặc str sang byte hoặc một số vấn đề sắp xếp/so sánh trong đó người ta phải sửa tên khóa trong hàm được sắp xếp. Đây là quy trình lặp đi lặp lại cho đến khi tất cả thời gian chạy mã được xác thực

Khi một mẫu chung chắc chắn rõ ràng, thì bạn có thể thực hiện grep và sed để thay thế trên nhiều tệp lớp. Nếu bạn không chắc chắn về mã khác cho đến khi chạy, thì hãy hoãn lại cho đến khi lớp kiểm tra đó được thực thi.  

Có thể có vấn đề với các thư viện/mô-đun của bên thứ ba có thể đã thay đổi, những vấn đề đó cần được tìm kiếm trên web và sử dụng một cách thích hợp

Đảm bảo tất cả đường dẫn mã được bao phủ bằng cách chạy trên tất cả các nền tảng và thông số được hỗ trợ

3. Xác thực thời gian chạy và sửa lỗi

Khi quá trình chuyển đổi hoàn tất, hãy thực hiện nhiều thời gian chạy mã vì Python là ngôn ngữ động. Mặt khác, các thay đổi có thể phá vỡ mọi thứ nếu bạn chỉ kiểm tra/thay đổi mã tĩnh trực quan. Bạn có thể bắt đầu với các bài kiểm tra độ chính xác cơ bản, bài kiểm tra chấp nhận và sau đó chọn các bài kiểm tra đầy đủ từ một mô-đun kiểm tra duy nhất

Khi bạn cảm thấy thoải mái, hãy lần lượt thực hiện với tất cả các mô-đun khác. Tiếp tục kiểm tra các thay đổi đối với kho lưu trữ mới. Ngoài ra, bạn cần đảm bảo không có hồi quy với các thay đổi được chuyển từ kho lưu trữ mới này bằng cách chạy kiểm tra độ chính xác trên các bản dựng mới hơn. Also, the validation should include all the supported platforms with Python 3

 

Python 3 Ported Mã và trạng thái

Below is where to find the new repository for Python 3 ported code until it is merged to the main repository. The plan is to do one cycle of porting or intermediately take the changes from the main repo and do a manual merge to this

https. //github. com/couchbaselabs/testrunner-py3/

[Branch. master]

Nhiều thay đổi phổ biến đã được thực hiện nhưng chưa hoàn thành vì có thể có một số vấn đề về thời gian chạy khác. Fixes in common can also be regressed to the earlier fixes because of assumptions on input value type conversions. There is still some more ported code to be validated with Python 3 and the effort is still in progress

Now, let me show you the common issues that occurred during the runtime validation. You can use this as a reference when you hit an issue to see if you are having the similar issue. You can apply the same solution and see if it works for you. And if you have any new ideas, you can put them in the comments.

Common Runtime Problems

 

1. Problem[s]

  • You might get some of the below TypeErrors during runtime like str instead of bytes and bytes instead of str
  • Error#1. TypeError. can’t concat str to bytes
  • Error#2. TypeError. must be str, not bytes
    • con trăn

      1

      2

      3

      4

      5

      6

      7

      File "lib/mc_bin_client. py", line 53, in __init__    

      if msg. supermsg += ".   " + str[msg]

      TypeError. must be str, not bytes

       

      File "lib/mc_bin_client. py", line 141, in _recvMsg     

      response += data

      TypeError. must be str, not bytes

  • Error#3. TypeError. a bytes-like object is required, not ‘str’
    • con trăn

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      File "lib/remote/remote_util. py", line 3038, in log_command_output    

      if "Warning" in line and "hugepages" in line.

      TypeError. a bytes-like object is required, not 'str'

       

      File "lib/tasks/task. py", line 1167, in run_high_throughput_mode    

      raise Exception[rv["err"]]

      Exception. a bytes-like object is required, not 'str'

       

      File "lib/mc_bin_client. py", line 936, in _set_vbucket    

      self. vbucketId = [[[zlib. crc32[key]] >> 16] & 0x7fff] & [self. vbucket_count - 1]

      TypeError. a bytes-like object is required, not 'str'

       

       

      File "lib/mc_bin_client. py", line 148, in _recvMsg     

      magic = struct. unpack[">B", response[0. 1]][0]

      TypeError. a bytes-like object is required, not 'str'

       

      File "lib/remote/remote_util. py", line 4560, in check_cmd    

      if out and command_output in out[0].

      TypeError. a bytes-like object is required, not 'str'

  • Error#4. TypeError. Cannot mix str and non-str arguments
    • con trăn

      1

      2

      3

      4

      5

      6

      7

      File "lib/mc_bin_client. py", line 126, in _sendMsg    

      self. s. send[msg + extraHeader + key + val + extended_meta_data]

      TypeError. can ' t concat str to bytes

       

      File "/usr/lib64/python3. 6/urllib/phân tích cú pháp. py", dòng 120, in _coerce_args    

      raise TypeError["Không thể trộn đối số str và không phải str"]

      TypeError. Không thể trộn str không-str arguments

Các giải pháp]

Xem các loại biến trong câu lệnh và sử dụng xxx. encode[] để lấy byte hoặc xxx. decode[] để lấy chuỗi hoặc sử dụng tiền tố b hoặc sử dụng str[]. Đôi khi, đầu vào có thể không xác định và trong trường hợp này, hãy sử dụng try x. mã hóa [] ngoại trừ AttributeError. đi qua


2. Các vấn đề]

TypeError. root – LỖI – ——-> cài đặt không thành công. một đối tượng giống như byte là bắt buộc, không phải là 'str'

Các giải pháp].  

Trong trường hợp này, hãy thêm b làm tiền tố cho chuỗi được so sánh hoặc thay đổi loại byte thành loại chuỗi. Thí dụ. lib/từ xa/remote_util. py

con trăn

1

2

if o[0] != b"".                     

   o = o[0].tách[b" "]

Bao quanh bằng try-ngoại trừ để kiểm tra chính xác dòng gây ra lỗi [nói ở trên TypeError. ]

con trăn

1

2

3

4

5

6

7

8

9

10

11

  nhập truy ngược                   

thử.   

..                   

ngoại trừ Ngoại lệ như e.                      

   log. info["{}". format[e]]                      

   traceback. print_exc[]                      

   exc_type, exc_obj, exc_tb = sys. exc_info[]                      

   fname = os. path. split[exc_tb. tb_frame. f_code. co_filename][1]                      

   print[exc_type, fname, exc_tb. tb_lineno]

Sample output after traceback. print_exec[] to see the full stack trace in similar to java

Fix with changes to lib/remote/remote_util. py as below

con trăn

1

2

3

4

5

6

   

3079         for line in output.    

3080               try.    

3081               line=line. decode[]    

3082             except AttributeError.    

3083               pass

3. Problem[s]

con trăn

1

2

3

File "lib/membase/api/rest_client. py", line 4178, in multiscan_count_for_gsi_index_with_rest    

content = content. split["[]"][0]

TypeError. a bytes-like object is required, not 'str'

 

Các giải pháp]

con trăn

1

content = content. split[b'[]'][0]. decode[]

 

4. Problem[s]

AttributeError suite_setUp[] or suite_tearDown[] are missing for some testsuites

con trăn

1

AttributeError. type object 'XDCRAdvFilterTests' has no attribute 'suite_setUp'

Các giải pháp]

Add the dummy suite_setUp[] and suite_tearDown[] methods.  

Vỏ bọc

1

2

3

4

5

6

7

8

11a12,18

>

>     def suite_setUp[self].

>         print["*** XDCRAdvFilterTests . suite_Setup[] ***"]

>

>     def suite_tearDown[self].

>         print["*** XDCRAdvFilterTests . suite_tearDown[] ***"]

>

 

5. Problem[s]

con trăn

1

2

3

File ". /testrunner. py", line 416, in main     

result. errors = [[name, e. message]]

AttributeError. 'AttributeError' object has no attribute 'message'

 

Các giải pháp]

con trăn

1

result. errors = [[name, str[e]]]

 

6. Problem[s]

AttributeError. ‘Transport’ object has no attribute ‘_Thread__stop’

con trăn

1

2

3

4

5

6

7

8

9

10

File ". /testrunner. py", line 529, in main    

t. _Thread__stop[]

AttributeError. 'Transport' object has no attribute '_Thread__stop'

 

File "pytests/view/viewquerytests. py", line 45, in stop     

self. _Thread__stop[]

AttributeError. 'StoppableThread' object has no attribute '_Thread__stop'     

 

self. _stop[]

TypeError. 'Event' object is not callable

Các giải pháp]

There is no direct stopping of a non-daemonic thread. Nhưng sử dụng cú pháp khôn ngoan t. _stop[]. The recommendation is to use the graceful shutdown using a global flag and check in the thread’s run[] to break

[https. //stackoverflow. com/questions/27102881/python-threading-self-stop-event-object-is-not-callable]

7. Problem[s]

Test expirytests. ExpiryTests. test_expired_keys was not found. mô-đun 'chuỗi' không có thuộc tính 'dịch'

Các giải pháp]

Rewrite with str static methods. Không có cách cũ để lấy tất cả các ký tự, vì vậy chúng tôi đã sử dụng mã trước đó và sử dụng tổng số

vi lib/membase/api/tap. py

con trăn

1

2

3

4

5

6

7

8

def buildGoodSet[goodChars=string.có thể in được, badChar=' . ]:     

143     """Tạo bảng dịch biến tất cả các ký tự không thành GoodChars    

144     to badChar"""     

145     allChars = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'[]*+,-./0123        456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x9     3\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\x bb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\        xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'    

146     ký tự xấu = str.maketrans[allChars, allChars, goodChars]    

147     badchars1=str.dịch[allChars,badchars]    

148     rv = str.maketrans[badchars1, badChars * len[badchars1]]    

149     return rv

 

8. Các vấn đề]

TabLỗi. sử dụng không nhất quán các tab và khoảng trắng trong thụt đầu dòng

con trăn

1

2

3

4

Tệp "pytests/security/audittest. py", dòng 396     

shell = RemoteMachineShellConnection[self.sư phụ]                                                     

^

Lỗi tab. không nhất quán việc sử dụng của tab spaces in indentation

 

Các giải pháp]

Tìm kiếm ký tự tab và thay thế bằng ký tự khoảng trắng.  

Đối với sự cố trên, hãy xóa các ký tự tab

Vỏ bọc

1

sed -i 's/\t/      /g' pytests/security/audittest.py

 

9. Các vấn đề]

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Tệp "lib/couchbase_helper/documentgenerator. py", dòng 83, in __next__    

giá trị = arg[hạt % len[arg]]

TypeError. danh sách chỉ số phải số nguyênor slices, not float

 

Tệp "lib/membase/helper/bucket_helper. py", dòng 517, in load_some_data    

key = ["key_%s_%d" % [testuuid, i] for i in range[number_of_buckets]]

TypeError. 'float' đối tượng không thể interpreted as an integer 

 

Tệp "lib/membase/helper/bucket_helper. py", dòng 372, in verify_data    

kiểm tra. assertEqual[giá trị, khóa, msg='values dont match']

Lỗi khẳng định. b'key_d918f450-5858-4430-a016-230e1f45bcf9_0' . = 'key_d918f450-5858-4430-a016-230e1f45bcf9_0' . giá trị không khớp

 

Tệp "pytests/setgettests. py", dòng 90, in set_get_test    

bản thân. kiểm tra. không thành công["giá trị không khớp với khóa {0}". định dạng[khóa]]

AssertionError. giá trị không khớp cho khóa 9fcbd36f-e34d-477b-9fc5-0a5d067dff4b

 

Tệp "pytests/security/auditmain. py", dòng 320, in returnFieldsDef    

nếu [trường hợp[[particulars['mandatory_fields'][items.mã hóa['utf-8']]], dict]]:

Lỗi phím. b'bucket_name'

 

Tệp "lib/task/task. py", dòng 2370, in _check_ddoc_revision    

new_rev_id = chính mình. _parse_revision[meta[']]

Lỗi phím. 'rev'

Các giải pháp]

Vấn đề phân biệt chữ hoa chữ thường. Đã sửa lỗi bằng cách thay đổi từ khóa x_couchbase_meta thành X_Couchbase_Meta

 

10. Các vấn đề]

  • Lỗi #1. LoạiLỗi. '=' không được hỗ trợ giữa instances of 'int' and 'NoneType'

    Các giải pháp]

    Ở đây, nó sẽ trả về int vì python 3 không tự động so sánh như trong python 2

     

    14. Các vấn đề]

    con trăn

    1

    hasattr[mục, ' iteritems] doesnt return true

    Các giải pháp]

    con trăn

    1

    2

    3

    4

    5

    6

    7

    8

    @@ -754,7 +755,7 @@ class MemcachedClient[object]:          

    # Nếu đây là lệnh, hãy chuyển đổi nó thành trình tạo cặp

    bộ sưu tập = bản thân. collection_name[bộ sưu tập]  > 8] ^ crc32tab[int[[crc ^ ord[ch]] & 0xff]]

    TypeError. ord[] expected string of length 1, but int found

    Các giải pháp]

    Đã chuyển đổi khóa thành chuỗi sao cho ch là chuỗi thay vì int bằng khóa nhị phân. xem tập tin

    con trăn

    1

    2

    3

    4

    thử.  

      phím = phím. giải mã[]

    ngoại trừ

      AttributeError.   pass

     

    16. Các vấn đề]

    LoạiLỗi. Đối tượng 'FileNotFoundError' không thể đăng ký

    Các giải pháp]

    Đã thay đổi trong Python 3 vì FileNotFoundError không thể tập lệnh phụ và thay vào đó, hãy sử dụng thuộc tính errno,  e. sai lầm

    con trăn

    1

    2

    3

    4

    5

    Tệp "lib/remote/remote_util. py", dòng 1714, in create_directory    

    if e[0] == 2:

    TypeError. 'FileNotFoundError' đối tượng không phải subscriptable

    -             if e[0] == 2:

    +             if e.errno == 2.

     

    17. Các vấn đề]

    con trăn

    1

    2

    3

    4

    5

    6

    Truy nguyên [hầu hết cuộc gọi gần đây last]:   

    Tệp "lib/couchbase_helper/tuq_helper. py", dòng 521, in run_query_and_verify_result    

    bản thân. _verify_results[sorted_actual_result, sorted_expected_result]  

    Tệp "lib/couchbase_helper/tuq_helper. py", dòng 114, in _verify_results    

    tăng Ngoại lệ[tin nhắn]

    Ngoại lệ. Cái số của hàng khớpbut the results mismatch, please check

    Các giải pháp]

    So sánh từ điển/danh sách lồng nhau không hoạt động do chức năng sắp xếp trước đó để sắp xếp hoàn toàn hiện không khả dụng. Sử dụng mô-đun deepdiff và lớp DeepDiff để so sánh

     

    18. Các vấn đề]

    Lỗi thuộc tính. mô-đun 'chuỗi' không có thuộc tính 'thay thế'

    1

    2

    3

    Tệp "scripts/populateIni. py", dòng 52, in main    

    dữ liệu[i] = string.thay thế[dữ liệu[i], 'dynamic', servers[0]]

    Lỗi thuộc tính. mô-đun 'chuỗi' không attribute 'replace'

    Các giải pháp]

    Sử dụng biến str trực tiếp để thay thế như hình bên dưới để khắc phục sự cố

    con trăn

    1

    dữ liệu[i]. thay thế[ 'động', servers[0]]

     

    19. Các vấn đề]

    con trăn

    1

    TypeError. '>' không được hỗ trợ giữa instances of 'int' and 'str'

    Các giải pháp]

    Sử dụng chức năng str hoặc int một cách thích hợp

    con trăn

    1

    2

       if mệnh đề where.

    +             where_clause = where_clause. thay thế['if  t > "', 'if str[t] > "'] # to fix the type error between int, str comparison

     

    20. Các vấn đề]

    TênLỗi. tên 'cmp' không được xác định

    Các giải pháp]

    Sử dụng mô-đun deepdiff và lớp DeepDiff để so sánh đối tượng

     

    21. Các vấn đề]

    con trăn

    1

    2

    3

       Tệp "lib/couchbase_helper/tuq_helper. py", dòng 782, in verify_indexes_redistributed    

    if cmp[items_count_before_rebalance, items_count_after_rebalance] != 0.

    Lỗi Tên. tên 'cmp' không phải defined

    Các giải pháp]

    con trăn

    1

    2

    3

    4

    5

    Sử dụng deepdiff mô-đun DeepDiff class to do object comparison.

    -         if cmp[index_state_before_rebalance, index_state_after_rebalance] != 0.

    +         if DeepDiff[index_state_before_rebalance, index_sFile "lib/couchbase_helper/documentgenerator.py", dòng 19, in has_next    

    trả về chính mình. itr

Chủ Đề