Kiểm tra xem tập lệnh python có đang chạy bash không

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 sau

import 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 Python

Trong 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ông

Trong 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

________số 8_______

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ại

Hà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 đầ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
8

Chạ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ản

Trong 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
8

import 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 thi

Khô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ệnh

Ghi 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
6

Chạ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 đổi

list_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

  • list_files = subprocess.run[["ls", "-l"]]
    
    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ày
  • list_files = subprocess.run[["ls", "-l"]]
    
    5 trả 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
    
    0 và
    list_files = subprocess.run[["ls", "-l"]]
    
    7 dưới dạng chuỗi. Kiểu trả về mặc định là byte
  • list_files = subprocess.run[["ls", "-l"]]
    
    8 yêu cầu Python thêm chuỗi làm đầu vào cho lệnh
    list_files = subprocess.run[["ls", "-l"]]
    
    9

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ưới

import 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!
0

Bằ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 thi

Hà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ó 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ỗi

Theo 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!
1

Mã 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 Python

Giả 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 thành 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
6

Trong 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!
3

Phươ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 đặt

Sau 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ự án

Cá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 shell, 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 valueobjectobject

Phầ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

Chủ Đề