Vietnamese (Tiếng Việt) translation by 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 ls
liệt kê tất cả các tập tin trong thư mục. Nếu bạn để nguyên ls
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:
1 |
Traceback (most recent call last): |
2 |
File "test.py", line 1, in <module> |
3 |
ls
|
4 |
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 ls
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 os.system()
từ module os
của Python.
Như đã đề cập trong tài liệu hướng dẫn, os.system()
:
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 ls
bằng Python như sau:
1 |
import os |
2 |
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 .py
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 date
của Unix như sau:
1 |
import os |
2 |
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:
Tue May 24 17:29:20 CEST 2016
call()
Mặc dù os.system()
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 call(args)
nằm trong mô-đun subprocess
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 ls
của Unix bằng phương thức này, chúng ta có thể làm như sau:
1 |
from subprocess import call |
2 |
call('ls') |
Hãy xem làm thế nào chúng ta có thể trả về ngày bằng mô-đun subprocess
, nhưng chúng ta hãy làm cho ví dụ trở nên thú vị hơn.
1 |
import subprocess |
2 |
time = subprocess.Popen('date', stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
3 |
output, err = time.communicate() |
4 |
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 check_output()
, như sau:
1 |
import subprocess |
2 |
time = subprocess.check_output('date') |
3 |
print 'It is', time |
Đầu ra của script ở trên là:
It is Tue May 24 19:14:22 CEST 2016
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 subprocess
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 subprocess
, 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.