Trong hướng dẫn này, chúng ta sẽ tìm hiểu về cách thực thi lệnh hệ thống trong Python.
Lệnh hệ thống trong Python
Khi viết chương trình bằng Python, đôi khi bạn sẽ cần thực thi một số lệnh shell để phục vụ cho chương trình của mình. Ví dụ, nếu sử dụng PyCharm
IDE, bạn có thể thấy rằng có tùy chọn chia sẻ dự án lên GitHub. Và có lẽ bạn cũng biết rằng việc truyền tải file này được thực hiện thông qua git, một công cụ vận hành bằng dòng lệnh. Do đó, PyCharm đã thực thi một số lệnh shell ngầm phía sau để thực hiện việc đó.
Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu những kiến thức cơ bản về cách thực thi lệnh shell từ mã Python.
Hàm os.system() trong Python
Chúng ta có thể thực thi lệnh hệ thống bằng cách sử dụng hàm os.system()
. Theo tài liệu chính thức, hàm này:
Được triển khai bằng cách gọi hàm system() trong ngôn ngữ C chuẩn, và có cùng các giới hạn.
Tuy nhiên, nếu lệnh tạo ra bất kỳ đầu ra nào, thì đầu ra đó sẽ được gửi đến luồng xuất tiêu chuẩn của trình thông dịch Python. Việc sử dụng hàm này không được khuyến khích.
Trong đoạn mã sau đây, chúng ta sẽ thử kiểm tra phiên bản của Git bằng cách sử dụng lệnh hệ thống git --version
.
import os
cmd = "git --version"
returned_value = os.system(cmd) # returns the exit code in unix
print('returned value:', returned_value)
Kết quả sau đây được tìm thấy trên Ubuntu 16.04, nơi Git đã được cài đặt sẵn.
git version 2.14.2
returned value: 0
Lưu ý rằng chúng ta không chủ động in kết quả của lệnh git --version
ra màn hình, mà nó được in ra vì console chính là luồng xuất tiêu chuẩn trong trường hợp này.
Hàm subprocess.call() trong Python
Ở phần trước, chúng ta đã thấy rằng hàm os.system()
hoạt động tốt. Tuy nhiên, đó không phải là cách được khuyến nghị để thực thi các lệnh shell. Thay vào đó, chúng ta sẽ sử dụng mô-đun subprocess
trong Python để chạy lệnh hệ thống.
Chúng ta có thể chạy các lệnh shell bằng cách sử dụng hàm subprocess.call()
. Hãy xem đoạn mã sau, vốn tương đương với đoạn mã sử dụng os.system()
ở phần trước.
import subprocess
cmd = "git --version"
returned_value = subprocess.call(cmd, shell=True) # returns the exit code in unix
print('returned value:', returned_value)
Và kết quả đầu ra cũng sẽ giống y như vậy.
Hàm subprocess.check_output() trong Python
Cho đến giờ, chúng ta đã thực thi các lệnh hệ thống bằng Python, nhưng vẫn chưa thể xử lý được kết quả đầu ra do các lệnh đó tạo ra. Với hàm subprocess.check_output()
, chúng ta có thể lưu kết quả đầu ra vào một biến để dễ dàng thao tác hoặc xử lý sau đó.
import subprocess
cmd = "date"
# returns output as byte string
returned_output = subprocess.check_output(cmd)
# using decode() function to convert byte string to string
print('Current date is:', returned_output.decode("utf-8"))
Nó sẽ tạo ra kết quả đầu ra như sau:
Current date is: Thu Oct 5 16:31:41 IST 2017
Vậy là trong các phần trên, chúng ta đã thảo luận về những ý tưởng cơ bản liên quan đến việc thực thi lệnh hệ thống trong Python.