Ngoài những gì @pf_moore đã nói về việc xem qua các hướng dẫn và mã của người khác, tôi thực sự khuyên bạn nên xem PEP-8. Nó khá dài, nhưng nó là hướng dẫn tạo kiểu chính thức cho Python và rất đáng để đọc. Điều này sẽ không cho bạn biết mọi thứ bạn cần biết, nhưng đó là một nơi tuyệt vời để bắt đầu
Ngoài ra, liên quan đến ví dụ mã cụ thể mà bạn đang sử dụng, thay vì sử dụng một danh sách riêng cho các chỉ mục, bạn chỉ cần sử dụng một bộ. Thông thường, mục đầu tiên là chỉ mục và mục thứ hai là giá trị thực
arch.append[[a_idx, a]]
arch_hp.append[a_hp_idx, a_hp]
Một phần quan trọng của thiết kế mã thành ngữ cũng liên quan đến việc sử dụng đúng cấu trúc dữ liệu và thiết kế lớp. Phần lớn điều này được đề cập trong hướng dẫn chính thức
Các nhiệm vụ lặp đi lặp lại đã chín muồi để tự động hóa. Các nhà phát triển và quản trị viên hệ thống thường tự động hóa các tác vụ thông thường như kiểm tra tình trạng và sao lưu tệp bằng tập lệnh shell. Tuy nhiên, khi các tác vụ đó trở nên phức tạp hơn, các tập lệnh shell có thể trở nên khó bảo trì hơn
May mắn thay, chúng ta có thể sử dụng Python thay vì shell script để tự động hóa. Python cung cấp các phương thức để chạy các lệnh shell, cung cấp cho chúng ta chức năng giống như các tập lệnh shell đó, với sự hỗ trợ bổ sung từ hệ sinh thái của Python. Học cách chạy các lệnh shell trong Python mở ra cơ hội để chúng ta tự động hóa các tác vụ máy tính theo cách có cấu trúc và có thể mở rộng
Trong bài viết này, chúng ta sẽ xem xét các cách khác nhau để thực thi lệnh shell trong Python và tình huống lý tưởng để sử dụng từng phương thức
Sử dụng hệ điều hành. hệ thống để chạy một lệnh
Python cho phép chúng ta thực thi ngay một lệnh shell được lưu trữ trong một chuỗi bằng cách sử dụng hàm
$ python3 echo_adelle.py
Hello from the other side!
4. Hãy bắt đầu bằng cách tạo một tệp Python mới có tên là $ python3 echo_adelle.py
Hello from the other side!
5 và nhập thông tin sauimport os
os.system["echo Hello from the other side!"]
Điều đầu tiên chúng tôi làm trong tệp Python của mình là nhập mô-đun
$ python3 echo_adelle.py
Hello from the other side!
6, chứa hàm $ python3 echo_adelle.py
Hello from the other side!
7 có thể thực thi các lệnh trình bao. Dòng tiếp theo thực hiện chính xác điều đó, chạy lệnh $ python3 echo_adelle.py
Hello from the other side!
8 trong shell của chúng ta thông qua PythonTrong Terminal của bạn, hãy chạy tệp này bằng cách sử dụng lệnh sau và bạn sẽ thấy đầu ra tương ứng
$ python3 echo_adelle.py
Hello from the other side!
Vì các lệnh
$ python3 echo_adelle.py
Hello from the other side!
8 in tới $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
0 của chúng tôi, nên $ python3 echo_adelle.py
Hello from the other side!
4 cũng hiển thị đầu ra trên luồng $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
0 của chúng tôi. Mặc dù không hiển thị trong bảng điều khiển, nhưng lệnh $ python3 echo_adelle.py
Hello from the other side!
4 trả về mã thoát của lệnh shell. Mã thoát bằng 0 có nghĩa là nó chạy mà không có bất kỳ sự cố nào và bất kỳ số nào khác có nghĩa là có lỗi. Bằng cách này, bạn có thể kiểm soát luồng lệnh của mình, kiểm tra kết quả và thử lại hoặc trả về lỗi nếu bất kỳ cuộc gọi nào không thành côngTrong tập lệnh này, chúng tôi tạo hai biến lưu trữ kết quả thực hiện các lệnh thay đổi thư mục thành thư mục chính và thư mục không tồn tại. Chạy file này ta sẽ thấy
$ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
Lệnh đầu tiên, thay đổi thư mục thành thư mục chính, thực hiện thành công. Do đó,
$ python3 echo_adelle.py
Hello from the other side!
4 trả về mã thoát của nó, số 0, được lưu trữ trong $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
5. Mặt khác, $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
6 lưu trữ mã thoát của lệnh bash không thành công để thay đổi thư mục thành thư mục không tồn tạiHàm
$ python3 echo_adelle.py
Hello from the other side!
4 thực thi một lệnh, in bất kỳ đầu ra nào của lệnh ra bàn điều khiển và trả về mã thoát của lệnh. Nếu chúng ta muốn kiểm soát chi tiết hơn đối với đầu vào và đầu ra của lệnh shell trong Python, chúng ta nên sử dụng mô-đun $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
8Chạy một lệnh với quy trình con
Mô-đun quy trình con là cách được đề xuất của Python để thực thi các lệnh shell. Nó mang lại cho chúng tôi sự linh hoạt để chặn đầu ra của lệnh shell hoặc xâu chuỗi đầu vào và đầu ra của nhiều lệnh khác nhau, trong khi vẫn cung cấp trải nghiệm tương tự như
$ python3 echo_adelle.py
Hello from the other side!
4 cho các trường hợp sử dụng cơ bảnTrong một tệp mới có tên là
import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
0, hãy chạy một lệnh với mô-đun $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
8import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
Trong dòng đầu tiên, chúng tôi nhập mô-đun
$ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
8, là một phần của thư viện chuẩn Python. Sau đó chúng ta sử dụng hàm import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3 để thực hiện lệnh. Giống như $ python3 echo_adelle.py
Hello from the other side!
4, lệnh import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3 trả về mã thoát của những gì đã được thực thiKhông giống như
$ python3 echo_adelle.py
Hello from the other side!
4, hãy lưu ý cách mà import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3 yêu cầu đầu vào là một danh sách các chuỗi thay vì một chuỗi đơn lẻ. Mục đầu tiên của danh sách là tên của lệnh. Các mục còn lại của danh sách là cờ và đối số của lệnhGhi chú. Theo nguyên tắc chung, bạn cần tách các đối số dựa trên khoảng trắng, ví dụ:
import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
8 sẽ là import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
9, trong khi $ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
0, sẽ là $ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
1. Một ví dụ khác, $ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
2 sẽ là $ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
3, trong khi $ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
4 hoặc $ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
5 sẽ là $ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
6Chạy tệp này và đầu ra của bảng điều khiển của bạn sẽ tương tự như
$ python3 list_subprocess.py
total 80
[email protected] 1 stackabuse staff 216 Dec 6 10:29 cd_return_codes.py
[email protected] 1 stackabuse staff 56 Dec 6 10:11 echo_adelle.py
[email protected] 1 stackabuse staff 116 Dec 6 11:20 list_subprocess.py
The exit code was: 0
Bây giờ, hãy thử sử dụng một trong những tính năng nâng cao hơn của
import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3, cụ thể là bỏ qua đầu ra thành $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
0. Trong cùng một tệp import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
0, hãy thay đổilist_files = subprocess.run[["ls", "-l"]]
để này
list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
Đầu ra tiêu chuẩn của lệnh hiện chuyển đến thiết bị
list_files = subprocess.run[["ls", "-l"]]
0 đặc biệt, có nghĩa là đầu ra sẽ không xuất hiện trên bảng điều khiển của chúng tôi. Thực thi tệp trong trình bao của bạn để xem đầu ra sau$ python3 list_subprocess.py
The exit code was: 0
Nếu chúng ta muốn cung cấp đầu vào cho một lệnh thì sao?
Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó
Chúng tôi sử dụng
import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3 với khá nhiều lệnh, hãy xem qua chúng
4 yêu cầu Python chuyển hướng đầu ra của lệnh tới một đối tượng để có thể đọc thủ công sau nàylist_files = subprocess.run[["ls", "-l"]]
5 trả vềlist_files = subprocess.run[["ls", "-l"]]
0 và$ python3 cd_return_codes.py `cd ~` ran with exit code 0 sh: line 0: cd: doesnotexist: No such file or directory `cd doesnotexist` ran with exit code 256
7 dưới dạng chuỗi. Kiểu trả về mặc định là bytelist_files = subprocess.run[["ls", "-l"]]
8 yêu cầu Python thêm chuỗi làm đầu vào cho lệnhlist_files = subprocess.run[["ls", "-l"]]
9list_files = subprocess.run[["ls", "-l"]]
Chạy cái này tạo ra đầu ra sau
Hello from the other side
Chúng tôi cũng có thể tăng
list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
0 mà không cần kiểm tra giá trị trả về theo cách thủ công. Trong một tệp mới, list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
1, hãy thêm mã bên dướiimport subprocess
failed_command = subprocess.run[["false"], check=True]
print["The exit code was: %d" % failed_command.returncode]
Trong Terminal của bạn, hãy chạy tệp này. Bạn sẽ thấy lỗi sau
$ python3 echo_adelle.py
Hello from the other side!
0Bằng cách sử dụng
list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
2, chúng tôi yêu cầu Python đưa ra bất kỳ ngoại lệ nào nếu gặp lỗi. Vì chúng tôi đã gặp lỗi nên câu lệnh list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
3 ở dòng cuối cùng không được thực thiHàm
import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3 mang lại cho chúng ta sự linh hoạt to lớn mà hàm $ python3 echo_adelle.py
Hello from the other side!
4 không có được khi thực thi các lệnh trình bao. Hàm này là sự trừu tượng hóa đơn giản của lớp list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6, cung cấp chức năng bổ sung mà chúng ta có thể khám pháChạy lệnh với Popen
Lớp
list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6 hiển thị nhiều tùy chọn hơn cho nhà phát triển khi tương tác với trình bao. Tuy nhiên, chúng ta cần nói rõ hơn về truy xuất kết quả và lỗiTheo mặc định,
list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6 không dừng xử lý chương trình Python nếu lệnh của nó chưa thực thi xong. Trong một tệp mới có tên là list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
9, hãy nhập nội dung sau$ python3 echo_adelle.py
Hello from the other side!
1Mã này tương đương với mã của
import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
0. Nó chạy một lệnh bằng cách sử dụng list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6 và đợi nó hoàn thành trước khi thực hiện phần còn lại của tập lệnh PythonGiả sử chúng ta không muốn đợi lệnh shell của mình thực thi xong để chương trình có thể làm việc trên những thứ khác. Làm sao nó biết khi nào lệnh shell đã thực thi xong?
Phương thức
$ python3 list_subprocess.py
The exit code was: 0
2 trả về mã thoát nếu một lệnh đã chạy xong hoặc $ python3 list_subprocess.py
The exit code was: 0
3 nếu nó vẫn đang thực thi. Ví dụ: nếu chúng tôi muốn kiểm tra xem $ python3 list_subprocess.py
The exit code was: 0
4 đã hoàn tất hay chưa thay vì đợi nó, chúng tôi sẽ có dòng mã sau$ python3 echo_adelle.py
Hello from the other side!
2Để quản lý đầu vào và đầu ra với
list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6 ta cần sử dụng phương thức $ python3 list_subprocess.py
The exit code was: 0
6Trong một tệp mới có tên là
$ python3 list_subprocess.py
The exit code was: 0
7, hãy thêm đoạn mã sau$ python3 echo_adelle.py
Hello from the other side!
3Phương thức
$ python3 list_subprocess.py
The exit code was: 0
6 nhận một đối số list_files = subprocess.run[["ls", "-l"]]
2 được sử dụng để truyền đầu vào cho lệnh trình bao. Phương thức Hello from the other side
0 cũng trả về cả $ python3 cd_return_codes.py
`cd ~` ran with exit code 0
sh: line 0: cd: doesnotexist: No such file or directory
`cd doesnotexist` ran with exit code 256
0 và list_files = subprocess.run[["ls", "-l"]]
7 khi chúng được đặtSau khi xem xét các ý tưởng cốt lõi đằng sau
list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6, giờ đây chúng ta đã đề cập đến ba cách để chạy các lệnh trình bao trong Python. Cùng kiểm tra lại các đặc điểm của chúng để biết phương pháp nào phù hợp nhất với yêu cầu của dự ánCách tiếp cận tốt nhất để chạy các lệnh Shell bằng Python?
Nếu bạn cần chạy một hoặc một vài lệnh đơn giản và không phiền nếu đầu ra của chúng được chuyển đến bàn điều khiển, bạn có thể sử dụng lệnh
$ python3 echo_adelle.py
Hello from the other side!
4. Nếu bạn muốn quản lý đầu vào và đầu ra của lệnh trình bao, hãy sử dụng import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3. Nếu bạn muốn chạy một lệnh và tiếp tục thực hiện công việc khác trong khi nó đang được thực thi, hãy sử dụng list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6Đây là bảng có một số khác biệt về khả năng sử dụng mà bạn cũng có thể sử dụng để đưa ra quyết định của mình
hệ điều hành. quy trình hệ thống. runsub process. PopenYêu cầu đối số được phân tích cú phápnoyesyesĐợi lệnhyesyesnoGiao tiếp với stdin và stdoutnoyesyesReturnsreturn valueobjectobjectPhần kết luận
Python cho phép bạn thực thi các lệnh shell mà bạn có thể sử dụng để khởi động các chương trình khác hoặc quản lý tốt hơn các tập lệnh shell mà bạn sử dụng để tự động hóa. Tùy thuộc vào trường hợp sử dụng của chúng tôi, chúng tôi có thể sử dụng
$ python3 echo_adelle.py
Hello from the other side!
4, import subprocess
list_files = subprocess.run[["ls", "-l"]]
print["The exit code was: %d" % list_files.returncode]
3 hoặc list_files = subprocess.run[["ls", "-l"], stdout=subprocess.DEVNULL]
6 để chạy các lệnh bash