Python

Python Standard Library – subprocess

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu cách sử dụng module subprocess của Python 3 để thực thi các command lines, nhằm thay thế cho các các method đã cũ như os.system() và os.popen().


FUNCTION SUBPROCESS.RUN()

Cách đơn giản nhất để sử dụng subprocess module là gọi function run() (hoặc function call() đối với Python 3.4 trở về trước).

Function:

CompletedProcessInstance = subprocess.run(args, *, stdin=None, stdout=None, stderr=None, encoding=None, shell=False)

Trong đó:

  • args – một String (với shell=True) hoặc một List chứa các thành phần của command line cần thực thi (với shell=False, cách này được khuyến khích, lý do sẽ được giải thích ở phần tham số shell);
  • stdin, stdout, stderr – tương ứng với standard input, standard outputstandard error file handle của chương trình cần thực thi. Có thể được gán là: subprocess.DEVNULL, subprocess.PIPE, file descriptor, file object và None.
  • encoding – được dùng để decode bytes string từ stdout và stderr; có thể là “utf-8” và “latin-1”;
  • shell – nếu shell=False, command line sẽ được thực thi ở child process, đảm bảo an toàn; nếu shell=True, command line sẽ được thực thi bởi system shell, dễ gây ra Shell Injection [1, 2];
  • CompletedProcessInstance – một instace của class CompletedProcess, gồm các attribute sau: args, returncode, stdout, stderr. Trong đó: stdout và stderr có thể ở kiểu bytes hoặc string (nếu encoding được chỉ định).

VÍ DỤ

Example:

from subprocess import run, PIPE

# command cần thực thi
cmd = "ls -l *.txt"

# file stdout.txt được dùng cho stdout
f = open("stdout.txt", "w")

# thực thi command ls -l *.txt
run(cmd.split(), stdout=f)
# thực thi command cat stdout.txt
output = run(["cat", "stdout.txt"], stdout=PIPE, encoding="utf-8")

print(output.stdout)

Output:
cmdline

Giải thích:
– Dòng 1: import function run và attribute PIPE;
– Dòng 10: thực thi command “ls -l *.txt” với stdout là file stdout.txt, tức là standard output sẽ được đưa vào file stdout.txt;
– Dòng 12: thực thi command “cat stdout.txt” với stdout là PIPE, lúc này standard output sẽ được truy cập thông qua attribute stdout của CompletedProcessInstance. Encoding được sử dụng là UTF-8, nhằm decode standard output từ kiểu bytes về string. Hãy xóa tham số encoding=”utf-8″ và chạy lại đoạn code trên để thấy sự khác biệt.

Cảm ơn các bạn đã theo dõi bài viết.
Thân ái và quyết thắng.


Reference:
[1] Shell Injection.
[2] Security Considerations.
[3] subprocess — Subprocess management.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s