“KHÔNG DÙNG. Python 2. 7 sẽ kết thúc vòng đời vào ngày 1 tháng 1 năm 2020. Vui lòng nâng cấp Python của bạn thành Python 2. 7 sẽ không được duy trì sau ngày đó. Phiên bản tương lai của pip sẽ bỏ hỗ trợ cho Python 2. 7. ”
Please take this seriously and plan accordingly. Python cập nhật lên 3. x không tương thích ngược. Những gì bạn viết với Python 2. x có thể không hoạt động bình thường khi sử dụng 3. x.
Hãy chắc chắn cũng đọc bản in đẹp. Theo trang web dành cho ngôn ngữ lập trình, ngày phát hành nâng cấp Python cuối cùng vẫn là TBD. “Là người cuối cùng trong 2 người. sê-ri x, 2. 7 sẽ nhận được hỗ trợ sửa lỗi cho đến năm 2020. Hỗ trợ chính thức ngừng vào ngày 1 tháng 1 năm 2020, nhưng bản phát hành cuối cùng sẽ diễn ra sau ngày đó. ” [1]
Vì vậy, Python 2 sẽ chuyển sang chế độ không được hỗ trợ vào cuối năm nay. 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 version [it depends on the pre-release, stable, security-fixes version on a specific platform, 3. 7 or 3. 6], which we are referring to as Python 3 throughout this blog. See more details on the release at Python releases download and Python 3 documentation.
Cheat Sheet
Sự thay đổi chính. Python 2 vs. Python 3
To get an idea on the key changes, here is the summary list of code changes needed from Python 2 to Python 3
Python 2Python 3 Text utf-8 . str
‘‘Text is unicode . str
u”Binary is same as Text. bytes/str
Example.
file. read[6] == ‘GIF89a’Binary data is represented as b prefix. bytes
b”
Use decode[] to get the string, encode[] to get bytes. Examples.
file. read[6] == b’GIF89a’
b’hello’. decode[] → ‘hello’
‘hello’. encode[] → b’hello’
str[b’hello’] → “b’hello’ “ Print statement
Example. print ‘ ‘Print function
Example. print[‘ ‘]Integer division
Example. 5/2=2Floor Division. Use 2 slashes
Example. 5//2 = 2 and 5/2=2. 5Float division
Example. 5/2. 0 = 2. 5 or 5. 0/2 = 2. 5Float Division. Use single slash
Example. 5/2 = 2. 5Long type is different from int
long There is no long type. It is same as intxrange[]range[]Iteration functions had iter prefix. iterxxx[]
Example. iteritems[]Dropped iter prefix. xxxx[]
Example. items[]Lists are directly loaded [all elements loaded into memory when list is used]
Example. for i in [] Lists are lazy loaded [when an element is accessed, then only loaded into memory]
Example. for i in list[[]] Dictionaries can be compared by default or against 2 dict.
Example. sorted[dict] Dictionaries can’t be compared directly. sorted[] should have key.
Example. đã sắp xếp[expected_result,key=[lambda x. x[xô. name][‘name’]]]For general dict/list comparison, you can use below.
from deepdiff import DeepDiff
diffs = DeepDiff[actual_result[‘results’], expected_result[ ‘results’ ], ignore_order= True ] if diffs.
self. khẳng địnhTrue[ Sai , khác]
Bytes and strings as values.
diffs = DeepDiff[set[actual_indexes], set[indexes_names], ignore_order= True , ignore_string_type_changes= True ]
- 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. mã url []
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
[Ví 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ăn1
brew cài đặt python3
Thiết lập môi trường ảo
Vỏ bọc1
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ọc1
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ọc1
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 ảoVỏ 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ọc1
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 install 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ọc1
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ọc1
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ếpVỏ bọc
1
# apt cài đặt python3-pip
Cài đặt các thư viện cần thiết
Vỏ bọc1
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 ]
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. list
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://gói. đế đ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ọc1
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. exePowerShell
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
PowerShell1
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. Trong lệnh cuối cùng, lưu ý rằng tất cả các thành ngữ đã được áp dụng. 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ọc1
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. Ngoài ra, quá trình xác thực phải bao gồm tất cả các nền tảng được hỗ trợ với Python 3
Python 3 Ported Mã và trạng thái
Dưới đây là nơi tìm kho lưu trữ mới cho mã chuyển Python 3 cho đến khi nó được hợp nhất vào kho lưu trữ chính. Kế hoạch là thực hiện một chu kỳ chuyển hoặc thực hiện trung gian các thay đổi từ repo chính và thực hiện hợp nhất thủ công với điều này
https. //github. com/couchbaselabs/testrunner-py3/
[Chi nhánh. sư phụ]
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. Các bản sửa lỗi chung cũng có thể được hồi quy về các bản sửa lỗi trước đó do các giả định về chuyển đổi loại giá trị đầu vào. Vẫn còn một số mã được chuyển nữa cần được xác thực bằng Python 3 và nỗ lực vẫn đang được tiến hành
Bây giờ, hãy để tôi chỉ cho bạn các sự cố thường gặp xảy ra trong quá trình xác thực thời gian chạy. Bạn có thể sử dụng điều này làm tài liệu tham khảo khi gặp sự cố để xem bạn có gặp sự cố tương tự không. Bạn có thể áp dụng giải pháp tương tự và xem nó có hiệu quả với bạn không. Và nếu bạn có bất kỳ ý tưởng mới nào, bạn có thể đưa chúng vào phần nhận xét.
Các vấn đề về thời gian chạy chung
1. Các vấn đề]
- Bạn có thể gặp một số TypeErrors bên dưới trong thời gian chạy như str thay vì byte và byte thay vì str
- Lỗi #1. LoạiLỗi. can’t concat str to bytes
- Lỗi #2. LoạiLỗi. phải là str, không phải byte
- con trăn
1
2
3
4
5
6
7
Tệp "lib/mc_bin_client. py", dòng 53, in __init__
tin nhắn nếu msg. siêu thư += ". " + str[tin nhắn]
TypeError. phải là str, không bytes
Tệp "lib/mc_bin_client. py", dòng 141, in _recvMsg
phản hồi += dữ liệu
TypeError. phải là str, không bytes
- con trăn
- Lỗi #3. LoạiLỗi. một đối tượng giống như byte là bắt buộc, không phải 'str'
- con trăn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Tệp "lib/remote/remote_util. py", dòng 3038, in log_command_output
if "Cảnh báo" trong dòng vàvà . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . và . "hugepages" in line:
TypeError. a byte-như đối tượng object is required, not 'str'
Tệp "lib/task/task. py", dòng 1167, in run_high_throughput_mode
tăng Ngoại lệ[rv["err"]]
Ngoại lệ. a byte-như đối tượng object is required, not 'str'
Tệp "lib/mc_bin_client. py", dòng 936, in _set_vbucket
bản thân. vbucketId = [[[ . zlib.crc32[phím]] . >> 16] & 0x7fff] & [self.vbucket_count - 1]
TypeError. a byte-như đối tượng object is required, not 'str'
Tệp "lib/mc_bin_client. py", dòng 148, in _recvMsg
ma thuật = struct. giải nén[">B", response[0:1]][0]
TypeError. a byte-như đối tượng object is required, not 'str'
Tệp "lib/remote/remote_util. py", dòng 4560, in check_cmd
if out and command_output in out[0]:
TypeError. a byte-như đối tượng object is required, not 'str'
- con trăn
- Lỗi #4. LoạiLỗi. Không thể trộn các đối số str và không str
- con trăn
1
2
3
4
5
6
7
Tệp "lib/mc_bin_client. py", dòng 126, in _sendMsg
bản thân. s. gửi[tin nhắn + tiêu đề phụ + key + val + extended_meta_data]
TypeError. có thể ' t concat str to bytes
Tệp "/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 và không-str arguments
- con trăn
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. vượt 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. Ví dụ. lib/từ xa/remote_util. py
con trăn1
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ăn1
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. thông tin["{}". định dạng[e]]
truy ngược. print_exc[]
exc_type, exc_obj, exc_tb = sys.exc_info[]
tên = os. đường dẫn. tách[exc_tb. tb_frame. f_code. co_filename][1]
in[exc_type, fname, exc_tb.tb_lineno]
Đầu ra mẫu sau khi truy nguyên. print_exec[] để xem dấu vết ngăn xếp đầy đủ tương tự như java
Khắc phục bằng các thay đổi đối với lib/remote/remote_util. py như dưới đây
con trăn1
2
3
4
5
6
3079 for line in output:
3080 try:
3081 line=line.giải mã[]
3082 except AttributeError:
3083 pass
3. Các vấn đề]
con trăn1
2
3
Tệp "lib/membase/api/rest_client. py", dòng 4178, in multiscan_count_for_gsi_index_with_rest
nội dung = nội dung. tách["[]"][0]
TypeError. a byte-như đối tượng object is required, not 'str'
Các giải pháp]
con trăn1
nội dung = nội dung. tách[b'[]'][0].giải mã[]
4. Các vấn đề]
AttributeError suite_setUp[] hoặc suite_tearDown[] bị thiếu đối với một số bộ thử nghiệm
con trăn1
Lỗi thuộc tính. loại đối tượng 'XDCRAdvFilterTests' có no attribute 'suite_setUp'
Các giải pháp]
Thêm các phương thức suite_setUp[] và suite_tearDown[] giả.
Vỏ bọc1
2
3
4
5
6
7
8
11a12,18
>
> def suite_setUp[self]:
> in["*** XDCRAdvFilterTests. suite_Setup[] ***"]
>
> def suite_tearDown[self]:
> print["*** XDCRAdvFilterTests . suite_tearDown[] ***"]
>
5. Các vấn đề]
con trăn1
2
3
Tệp ". /người kiểm tra. py", dòng 416, in main
kết quả. lỗi = [[tên . , e.thông báo]]
Lỗi thuộc tính. 'AttributeError' đối tượng có không có attribute 'message'
Các giải pháp]
con trăn1
kết quả. lỗi = [[tên, str[e]]]
6. Các vấn đề]
Lỗi thuộc tính. Đối tượng ‘Transport’ không có thuộc tính ‘_Thread__stop’
con trăn1
2
3
4
5
6
7
8
9
10
Tệp ". /người kiểm tra. py", dòng 529, in main
t. _Thread__stop[]
Lỗi thuộc tính. 'Vận chuyển' đối tượng có không có attribute '_Thread__stop'
Tệp "pytests/view/viewquerytests. py", dòng 45, in stop
bản thân. _Thread__stop[]
Lỗi thuộc tính. 'StoppableThread' đối tượng có không attribute '_Thread__stop'
bản thân. _stop[]
TypeError. 'Sự kiện' đối tượng là không phải 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. _dừng lại[]. Đề xuất là sử dụng tính năng tắt máy duyên dáng bằng cách sử dụng cờ chung và kiểm tra run[] của luồng để ngắt
[https. // stackoverflow. com/questions/27102881/python-threading-self-stop-event-object-is-not-callable]
7. Các vấn đề]
hết hạn kiểm tra. Hạn sử dụng. không tìm thấy test_expired_keys. mô-đun 'chuỗi' không có thuộc tính 'dịch'
Các giải pháp]
Viết lại bằng các phương thức tĩnh str. 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ăn1
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 đến 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. inconsistent use of tabs and spaces in indentation
con trăn1
2
3
4
Tệp "pytests/security/audittest. py", dòng 396
shell = RemoteMachineShellConnection[self. chính chủ]
^
Lỗi tab. không nhất quán việc sử dụng của tab và 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ọc1
sed -i 's/\t/ /g' pytests/security/audittest.py
9. Các vấ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 là 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ể là interpreted as an integer
File "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]]
Lỗi khẳng định. value mismatch for key 9fcbd36f-e34d-477b-9fc5-0a5d067dff4b
File "pytests/security/auditmain. py", dòng 320, in returnFieldsDef
if [isinstance[[particulars['mandatory_fields'][items. mã hóa['utf-8']]], dict]]:
KeyError. 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]
Case sensitiveness issue. Đã 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. '=' not supported between 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ăn1
hasattr[mục, ' iteritems’] doesn’t return true
Các giải pháp]
con trăn1
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]
Converted the key to string so that ch is string instead of int with binary key. xem tập tin
con trăn1
2
3
4
thử.
phím = phím. giải mã[]
except
AttributeError. pass
16. Problem[s]
LoạiLỗi. ‘FileNotFoundError’ object is not sub-scriptable
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ăn1
2
3
4
5
File "lib/remote/remote_util. py", dòng 1714, in create_directory
if e[0] == 2.
TypeError. 'FileNotFoundError' object is not subscriptable
- if e[0] == 2.
+ if e. errno == 2.
17. Các vấn đề]
con trăn1
2
3
4
5
6
Traceback [most recent call last].
File "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]
File "lib/couchbase_helper/tuq_helper. py", dòng 114, in _verify_results
raise Exception[msg]
Ngoại lệ. The number of rows match but the results mismatch, please check
Các giải pháp]
The nested dictionary/list comparison was not working because of the earlier sorted function to sort completely is now not available. Use deepdiff module and DeepDiff class to do the comparison
18. Các vấn đề]
Lỗi thuộc tính. module ‘string’ has no attribute ‘replace’
1
2
3
Tệp "scripts/populateIni. py", line 52, in main
dữ liệu[i] = string.replace[data[i], 'dynamic', servers[0]]
AttributeError. module 'string' has no 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ăn1
dữ liệu[i]. replace[ 'dynamic', servers[0]]
19. Các vấn đề]
con trăn1
TypeError. '>' không được hỗ trợ giữa instances of 'int' and 'str'
Các giải pháp]
Use str or int function appropriately
con trăn1
2
if where_clause.
+ < 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. name ‘cmp’ is not defined
Các giải pháp]
Sử dụng mô-đun deepdiff và lớp DeepDiff để so sánh đối tượng
21. Problem[s]
con trăn1
2
3
Tệp "lib/couchbase_helper/tuq_helper. py", line 782, in verify_indexes_ redistributed
if cmp[items_count_before_rebalance, items_count_after_rebalance] . = 0.
Lỗi Tên. name 'cmp' is not defined
Các giải pháp]
con trăn1
2
3
4
5
Sử dụng deepdiff mô-đun và 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", line 19, in has_ next
trả về chính mình. itr