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:
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 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:
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 .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:
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:
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:
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 subprocess
, 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 check_output[]
, như sau:
import subprocess time = subprocess.check_output['date'] 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.
Module os trong Python cung cấp các chức năng được sử dụng để tương tác với hệ điều hành và cũng có được thông tin liên quan về nó. OS đi theo các Module tiện ích tiêu chuẩn của Python. Module này cung cấp một cách linh động sử dụng chức năng phụ thuộc vào hệ điều hành.
Module os trong python cho phép chúng ta làm việc với các tập tin và thư mục.
Các hàm trong Module os được đưa ra dưới đây:
Hàm os.name
Hàm này cung cấp tên của Module os được import.
Hiện tại, nó đăng ký 'posix', 'nt', 'os2', 'ce', 'java' và 'riscos'. Ví dụ:
Kết quả:
Hàm os.getcwd[]
Nó trả về thư mục làm việc hiện tại [CWD] của tệp.
import os print[os.getcwd[]]
Kết quả:
E:\Python\workspace\py-test1\src\main
Hàm os.error
Hàm này xác định các lỗi cấp độ hệ điều hành. Nó ném ra lỗi OSError trong trường hợp tên và đường dẫn file không hợp lệ hoặc không thể truy cập, v.v.
import os try: # Nếu file không tồn tại. Nó sẽ ném ra một lỗi IOError filename = 'Python.txt' f = open[filename, 'rU'] text = f.read[] f.close[] # Nếu có lỗi xảy ra câu lệnh bên trong IOError.được thực thi except IOError: # print[os.error] will print['Problem reading: ' + filename]
Kết quả:
Problem reading: Python.txt
Hàm os.popen[]
Hàm này mở một tệp đến hoặc từ lệnh được chỉ định và nó trả về một đối tượng tệp được kết nối với một pipe.
import os fd = "python.txt" # popen[] là tương đương với open[] file = open[fd, 'w'] file.write["Hello Python!"] file.close[] file = open[fd, 'r'] text = file.read[] print[text] # popen[] cung cấp cổng kết nối và truy cập file trực tiếp file = os.popen[fd, 'w'] file.write["Hello Python!"]
Kết quả:
Hàm os.close[]
Hàm này dùng để đóng file.
import os fr = "Python1.txt" file = open[fr, 'r'] text = file.read[] print[text] os.close[file]
Kết quả:
Traceback [most recent call last]: File "E:\Python\workspace\py-test1\src\main\test.py", line 8, in file = open[fr, 'r'] FileNotFoundError: [Errno 2] No such file or directory: 'Python1.txt'
Hàm os.rename
Trong hàm này, một tệp hoặc thư mục có thể được đổi tên bằng cách sử dụng hàm os.rename[]. Người dùng có thể đổi tên tệp nếu nó có đặc quyền thay đổi tệp.
import os fd = "python.txt" os.rename[fd,'Python1.txt']
Kết quả:
Traceback [most recent call last]: File "E:\Python\workspace\py-test1\src\main\test.py", line 9, in os.rename[fd,'Python1.txt'] FileNotFoundError: [WinError 2] The system cannot find the file specified: 'python.txt' -> 'Python1.txt'
Hàm os.access[]
Hàm này sử dụng uid/gid thực để kiểm tra xem người dùng có quyền truy cập vào đường dẫn hay không.
import os import sys path2 = os.access["Python.txt", os.F_OK] print["File tồn tại:", path2] # Checking access with os.R_OK path2 = os.access["Python.txt", os.R_OK] print["Có quyền đọc file:", path2] # Checking access with os.W_OK path3 = os.access["Python.txt", os.W_OK] print["Có quyền ghi file:", path3] # Checking access with os.X_OK path4 = os.access["Python.txt", os.X_OK] print["Kiểm tra xem được file có được thực thi:", path4]
Kết quả:
File tồn tại: False Có quyền đọc file: False Có quyền ghi file: False Kiểm tra xem được file có được thực thi: False