Hướng dẫn python execute unix command - python thực hiện lệnh unix

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article) Dai Phong (you can also view the original English article)

Unix là một hệ điều hành được phát triển vào khoảng năm 1969 tại AT & T Bell Labs bởi Ken Thompson và Dennis Ritchie. Có nhiều lệnh Unix thú vị mà chúng ta có thể sử dụng để thực hiện các nhiệm vụ khác nhau. Câu hỏi đặt ra là, chúng ta có thể sử dụng các lệnh như vậy trực tiếp trong một chương trình Python được không? Đây là những gì tôi sẽ giới thiệu với bạn trong hướng dẫn này.

Lệnh Unix

import os
os.system('date')
0 liệt kê tất cả các tập tin trong thư mục. Nếu bạn để nguyên
import os
os.system('date')
0 trong một script Python, thì đây là những gì bạn sẽ nhận được khi bạn chạy chương trình:

Traceback (most recent call last):
  File "test.py", line 1, in 
    ls
NameError: name 'ls' is not defined

Điều này cho thấy rằng trình biên dịch của Python xem

import os
os.system('date')
0 như là một biến và yêu cầu nó phải được định nghĩa (tức là khởi tạo), và không coi nó như một lệnh Unix.

os.system()

Một giải pháp cho vấn đề này là sử dụng

import os
os.system('date')
3 từ module
import os
os.system('date')
4 của Python.

Như đã đề cập trong tài liệu hướng dẫn,

import os
os.system('date')
3:

Thực thi lệnh (một chuỗi) trong một shell con. Điều này được thực hiện bằng cách gọi hàm system tiêu chuẩn của ngôn ngữ C, và có những hạn chế tương tự.

Như vậy, chúng ta có thể chạy lệnh

import os
os.system('date')
0 bằng Python như sau:

import os
os.system('ls')

Điều này sẽ trả về danh sách các tập tin trong thư mục hiện tại của bạn, đó là nơi chứa chương trình

import os
os.system('date')
7 của bạn.

Hãy lấy một ví dụ khác. Nếu bạn muốn trả về ngày và giờ hiện tại, bạn có thể sử dụng lệnh lệnh

import os
os.system('date')
8 của Unix như sau:

import os
os.system('date')

Trong trường hợp của tôi, đây là kết quả mà tôi nhận được từ script trên:

import os
os.system('date')
9

call()

Mặc dù

import os
os.system('date')
3 làm việc tốt, nhưng nó không được khuyến khích sử dụng vì nó được xem như đã cũ và không được hỗ trợ. Một giải pháp được khuyến khích hơn đó là hàm
from subprocess import call
call('ls')
1 nằm trong mô-đun
from subprocess import call
call('ls')
2 của Python. Như đề cập trong tài liệu hướng dẫn về hàm này:

Thực thi lệnh được mô tả bởi args. Chờ cho lệnh thực thi xong, sau đó trả về thuộc tính returncode.

Nếu chúng ta muốn chạy lệnh

import os
os.system('date')
0 của Unix bằng phương thức này, chúng ta có thể làm như sau:

from subprocess import call
call('ls')

Hãy xem làm thế nào chúng ta có thể trả về ngày bằng mô-đun

from subprocess import call
call('ls')
2, nhưng chúng ta hãy làm cho ví dụ trở nên thú vị hơn.

import subprocess 
time = subprocess.Popen('date', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = time.communicate()
print 'It is', output

Ví dụ ở trên có thể được chạy đơn giản hơn bằng cách sử dụng

from subprocess import call
call('ls')
5, như sau:

import subprocess 
time = subprocess.check_output('date')
print 'It is', time

Đầu ra của script ở trên là:

from subprocess import call
call('ls')
6

Các ví dụ ở trên cho thấy tính linh hoạt trong việc sử dụng các hàm khác nhau của

from subprocess import call
call('ls')
2 và cách chúng ta có thể truyền kết quả vào các biến để thực hiện các hoạt động tiếp theo.

Tóm tắt

Như chúng ta đã thấy trong hướng dẫn này, các lệnh Unix có thể được gọi và thực thi bằng mô-đun

from subprocess import call
call('ls')
2, nó cung cấp tính linh hoạt cao khi làm việc với các lệnh Unix thông qua các hàm khác nhau của nó. Bạn có thể tìm hiểu thêm về mô-đun này và các hàm khác nhau của nó từ tài liệu hướng dẫn Python.

Với nhiệm vụ lặp đi lặp lại đã hoàn thiện cho tự động hóa. Thông thường các developer và quản trị viên hệ thống sẽ tự động hóa các tác vụ thông thường như health checks và sao lưu tệp bằng các 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 shell script 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 tương tự của các tập lệnh shell đó. Học cách chạy các lệnh shell trong Python mở ra cơ hội cho 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.

1. Sử dụng os.system để chạy 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 hàm os.system (). Hãy bắt đầu bằng cách tạo một tệp python mới có tên echo_adelle.py

import os

os.system("echo Hello from the other side!")

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!

Khi các lệnh echo in ra, os.system () cũng hiển thị đầu ra trên luồng. Mặc dù không hiển thị trong console, lệnh os.system () trả về mã của lệnh shell. Mã exit 0 có nghĩa là nó chạy mà không có bất kỳ vấn đề nào và bất kỳ số nào khác có nghĩa là lỗi. Để thấy rõ hơn mã exit , tạo file cd_return_codes.py với nội dung:

home_dir = os.system("cd ~")
print("`cd ~` ran with exit code %d" % home_dir)
unknown_dir = os.system("cd doesnotexist")
print("`cd doesnotexis` ran with exit code %d" % unknown_dir)

chúng ta tạo hai biến lưu trữ kết quả của việc thực thi các lệnh thay đổi thư mục vào thư mục chính và thư mục không tồn tại. Chạy tệp này, chúng 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

Với câu lệnh đầu, thay đổi thư mục thành thư muc home. os.system() trả về code 0 , với nơi lưu trữ là home_dir. Với cách khác, unknow_dir sẽ trả về mã code failed, với lệnh thay đổi đến thư mục không tồn tại. Os.system() thực thi 1 câu lệnh , in và cho ra kết quả đầu ra tại console, và trả về mã code của câu lệnh đó.

2. Sử dụng subprocess

Module subprocess thực sự được khuyên dùng để thực thi các lệnh shell. Nó cho phép chúng ta linh hoạt để lược bớt đầu ra của các lệnh shell hoặc chuỗi đầu vào và đầu ra của các lệnh khác nhau cùng nhau, trong khi vẫn cung cấp trải nghiệm tương tự như os.system () cho các trường hợp sử dụng cơ bản. Tạo file list_subprocess.py với nội dung

import os
os.system('ls')
0

Không giống os.system(), module subprocess.run() yêu cầu 1 list chuỗi các lệnh đầu vào thay vì 1 chuỗi string duy nhất , phần từ đầu tiên của list chính là tên lệnh thực thy , phần còn lại là biến số mà lệnh muốn thực hiện

Ví dụ: muốn thực hiện lệnh ls -alh sẽ có list ["ls", "-alh"] với tên lênh là ls với các tham số -a -l -h, Tương tự , lệnh echo hello world sẽ thành ["echo", "hello", "world"]hoặc ["echo", "hello world"]

import os
os.system('ls')
1

bây giờ muốn chỉnh lại lệnh ls với đầu ra chỉnh lại

import os
os.system('ls')
2

Đầu ra tiêu chuẩn của lệnh bây giờ chuyển sang /dev/null, có nghĩa là đầu ra sẽ không xuất hiện trên bảng điều khiển nữa. Thực hiện tệp trong trình bao của bạn để xem đầu ra sau:

import os
os.system('ls')
3

Thêm điều kiện cho điều này bằng đối số đầu vào của nó, với file cat_subprocess.py,

import os
os.system('ls')
4
  • stdout=subprocess.PIPE để Python chỉ ra đầu ra của lện là 1 object mà có thể đọc sau
  • text=True trả về stdout và stderr dưới dạng chuỗi, mặc định trả về bytes
  • input="Hello from the other side" để Python thêm chuỗi vào

Chúng ta cũ có thể raise Exception ngoài các trường hợp check trả về giá trị, tạo file false_subprocess.py

import os
os.system('ls')
5
import os
os.system('ls')
6

với check= True, exception xảy ra nếu có lỗi

3. Chạy câu lệnh với Popen

subprocess.Popen cung cấp nhiều lựa chọn hơn cho developer khi muốn tương tác với shell. Tuy nhiên nó chúng ta cũng cần rõ ràng hơn về việc lấy kết quả và lỗi. Mặc định subprocess.Popen không tự dừng processing của 1 chương trình python nếu lệnh không có hàm kết thúc, tạo 1 file mới list_popen.py

import os
os.system('ls')
7

Code này tương đương với code của list_sub process.py. Nó chạy một lệnh bằng cách sử dụng subprocess.Popen và đợi nó hoàn thành trước khi thực thi 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 hoàn thành thực thi để chương trình có thể hoạt động trên những thứ khác. Làm thế nào nó biết khi lệnh shell đã thực hiện xong? Phương thức poll () trả về code exit nếu một lệnh đã chạy xong hoặc Không có nếu nó vẫn đang thực thi. Ví dụ: nếu chúng tôi muốn kiểm tra xem list_dir đã hoàn thành thay vì chờ đợi, chúng ta sẽ có dòng mã sau:

import os
os.system('ls')
8

Để quản lý đầu ra , vào của subprocess.Popen, chúng ta cần sử dụng communicate()

import os
os.system('ls')
9

Phương thức communicate() lấy tham số input để sử dụng cho đầu ra của shell, nó đồng thời cũng có đầu ra và hiện lỗi khi chúng ta khái báo

4. So sánh

Hướng dẫn python execute unix command - python thực hiện lệnh unix
Nguồn : https://stackabuse.com/executing-shell-commands-with-python/