Subprocess trong Python là một mô-đun được sử dụng để chạy các code và ứng dụng mới bằng cách tạo các process mới. Nó cho phép bạn bắt đầu các ứng dụng mới ngay từ chương trình Python mà bạn hiện đang viết. Vì vậy, nếu bạn muốn chạy các chương trình bên ngoài từ kho lưu trữ git hoặc mã từ chương trình C hoặc C++, bạn có thể sử dụng Subprocess trong Python. Bạn cũng có thể lấy exit code và đường dẫn input, output hoặc lỗi bằng cách sử dụng Subprocess trong Python.
Subprocess trong Python được sử dụng để chạy các chương trình và tập lệnh mới bằng cách sinh ra các process mới. Và nó cho phép người dùng khởi chạy các chương trình mới ngay từ chương trình Python hiện tại nhờ mô-đun Subprocess.
Subprocess trong Python có thể hữu ích nếu bạn từng có ý định hợp lý hóa tập lệnh dòng lệnh của mình hoặc sử dụng Python cùng với các ứng dụng dòng lệnh—hoặc bất kỳ ứng dụng nào, cho vấn đề đó. Mô-đun Subprocess của Python có thể trợ giúp mọi thứ, từ khởi động giao diện GUI đến thực thi các lệnh trình terminal và chương trình dòng lệnh.
Và đừng quên rằng tất cả các tác vụ của Subprocess đã hoàn tất trong process cha. Nhiều hoạt động và hoạt động nền mà Python đã được gọi là các process. Đây được gọi là process cha mẹ.
Các process thường có các nhiệm vụ phải được thực hiện trước khi process có thể kết thúc. Và process cha mẹ này cần một người nào đó đảm nhận các nhiệm vụ này. Đó là nơi process cha này sinh ra Subprocess. Khi một tiến trình cần hoàn thành một tác vụ nhanh chóng, nó có thể tạo một tiến trình con để xử lý nó trong khi tiến trình chính vẫn đang chạy. Điều này làm cho việc quản lý dữ liệu và bộ nhớ trở nên dễ dàng và hiệu quả hơn. Bạn có thể chạy đồng thời nhiều process hơn bằng cách chia các tác vụ lớn hơn thành các Subprocess nhỏ hơn trong Python có thể xử lý các tác vụ đơn giản hơn trong một process. Và điều này được gọi là đa xử lý.
Làm cách nào để bắt đầu một process trong Python?
Để bắt đầu một process mới, hay nói cách khác, một Subprocess mới trong Python, bạn cần sử dụng lệnh gọi hàm Popen. Có thể truyền hai tham số trong lời gọi hàm. Tham số đầu tiên là chương trình bạn muốn bắt đầu và tham số thứ hai là đối số tệp. Trong ví dụ bên dưới, bạn sẽ sử dụng lệnh cat của Unix và example.py làm hai tham số. Lệnh cat là viết tắt của ‘concatenate’ và được sử dụng rộng rãi trong lập trình Linux và Unix. Nó giống như “cat example.py.” Bạn có thể bắt đầu bất kỳ chương trình nào trừ khi bạn chưa tạo nó.
#khai báo thư viện subprocess from subprocess import Popen, PIPE #tạo process gọi lệnh cat đọc file example.py process = Popen(['cat', 'example.py'], stdout=PIPE, stderr=PIPE) stdout, stderr = process.communicate() #xuất kết quả print(stdout)
Trong đoạn mã trên, process.communicate() là lệnh gọi chính đọc tất cả đầu vào và đầu ra của process. “Stdout” xử lý đầu ra của process và “stderr” dùng để xử lý bất kỳ loại lỗi nào và chỉ được ghi nếu có bất kỳ lỗi nào như vậy được đưa ra.
Subprocess Call() là gì?
Subprocess trong Python có phương thức call() được sử dụng để khởi tạo chương trình. Cú pháp của phương thức call() Subprocess này là:
sub process.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Các tham số của Sub process Call()
Phương thức call() từ Subprocess trong Python chấp nhận các tham số sau:
- args: Đây là lệnh mà bạn muốn thực hiện. Bạn có thể chuyển nhiều lệnh bằng cách tách chúng bằng dấu chấm phẩy (;)
- stdin: Điều này đề cập đến giá trị của luồng đầu vào tiêu chuẩn được truyền dưới dạng (os.pipe())
- stdout: Đó là giá trị thu được của luồng đầu ra tiêu chuẩn
- stderr: Điều này xử lý bất kỳ lỗi nào xảy ra từ luồng lỗi tiêu chuẩn
- shell: Đây là tham số boolean thực thi chương trình trong shell mới nếu được giữ đúng
Giá trị trả về của phương thức Call() từ Subprocess trong Python
Hàm call() của Subprocess Python trả về mã đã thực thi của chương trình. Nếu không có đầu ra chương trình, hàm sẽ trả về mã mà nó đã thực thi thành công. Nó cũng có thể gây ra ngoại lệ CalledProcessError.
Bây giờ, hãy sử dụng một ví dụ đơn giản để gọi một Subprocess cho lệnh Unix tích hợp “ls -l.” Lệnh ls liệt kê tất cả các tệp trong một thư mục và lệnh -l liệt kê các thư mục đó ở định dạng mở rộng.
import subprocess subprocess.call(["ls", "-l"])
Đơn giản như vậy, đầu ra hiển thị tổng số tệp cùng với ngày giờ hiện tại.
Lưu kết quả process (thiết bị xuất chuẩn) trong Subprocess ?
Đầu ra của process lưu hoặc thiết bị xuất chuẩn cho phép bạn lưu trữ đầu ra của mã trực tiếp trong một chuỗi với sự trợ giúp của hàm check_output. Cú pháp của phương thức này là:
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
Như bạn có thể thấy, hàm chấp nhận các tham số giống như phương thức call() ngoại trừ một tham số bổ sung, đó là:
universal_newlines: Đây là một tham số boolean mở các tệp có thiết bị xuất chuẩn và thiết bị xuất chuẩn trong một dòng mới chung khi được giữ đúng
Phương thức này cũng trả về cùng một giá trị như hàm call(). Bây giờ, hãy xem lại một ví dụ đơn giản. Lần này, bạn sẽ sử dụng lệnh echo của Linux được sử dụng để in đối số được truyền cùng với nó. Bạn sẽ lưu trữ đầu ra của lệnh echo trong một biến chuỗi và in nó bằng hàm in của Python.
import subprocess #gọi hàm echo s = subprocess.check_output(["echo", "Hello World!"]) print(s)
Ví dụ về sử dụng Subprocess trong Python
Hãy kết hợp cả hai hàm call() và check_output() từ Subprocess trong Python để thực thi các chương trình “Hello world” từ các ngôn ngữ lập trình khác nhau: C, C++ và Java. Trước tiên, bạn sẽ phải tạo ba tệp riêng biệt có tên Hello.c, Hello.cpp và Hello.java để bắt đầu. Sau khi tạo các tệp này, bạn sẽ viết các chương trình tương ứng trong các tệp này để thực thi “hello world” Hãy bắt đầu với ba tệp của chúng tôi.
Đối số thường được sử dụng
- args: Điều này đề cập đến lệnh bạn muốn chạy một Subprocess trong Python. Bằng cách sử dụng dấu chấm phẩy để phân tách chúng, bạn có thể chuyển nhiều lệnh (;)
- stdin: Điều này đề cập đến giá trị được gửi dưới dạng (os.pipe()) cho luồng đầu vào tiêu chuẩn.
- stdout: Nó đại diện cho giá trị được lấy từ luồng đầu ra tiêu chuẩn.
- stderr: stderr xử lý bất kỳ loại lỗi nào xảy ra trong trình bao.
- shell: shell là tham số boolean thực thi chương trình trong shell mới nếu chỉ được giữ đúng.
import subprocess import os def C_Execution(): # lưu trữ đầu ra s = subprocess.check_call("gcc Hello.c -o out1;./out1", shell = True) print(", return code", s) def Cpp_Execution(): # tạo một pipe gọi child process data, temp = os.pipe() # ghi đầu vào vào stdin và sử dụng utf-8 để chuyển đổi nó thành chuỗi byte os.write(temp, bytes("7 12\n", "utf-8")); os.close(temp) # lưu trữ đầu ra dưới dạng chuỗi byte s = subprocess.check_output("g++ Hello.cpp -o out2;./out2", stdin = data, shell = True) # giải mã để in một đầu ra bình thường print(s.decode("utf-8")) def Java_Execution(): # lưu trữ đầu ra s = subprocess.check_output("javac Hello.java;java Hello", shell = True) print(s.decode("utf-8")) # main if __name__=="__main__": C_Execution() Cpp_Execution() Java_Execution()