Hướng dẫn os.system trong python

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

Chủ Đề