Câu trả lời:
Nếu bạn kiểm tra phần quy trình con của tài liệu Python , bạn sẽ nhận thấy có một ví dụ về cách thay thế os.system()
bằng subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... làm điều tương tự như ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
Mã "cải tiến" trông phức tạp hơn, nhưng tốt hơn vì một khi bạn biết subprocess.Popen()
, bạn không cần bất cứ thứ gì khác. subprocess.Popen()
thay thế một số công cụ khác ( os.system()
chỉ là một trong số đó) nằm rải rác trong ba mô-đun Python khác.
Nếu nó hữu ích, hãy nghĩ về nó subprocess.Popen()
như là một rất linh hoạt os.system()
.
shell=True
nếu có thể. Có tùy chọn này là một trong những lợi ích của subprocess.Popen()
và các chức năng trợ giúp của nó.
os.system
và subprocess.call/popen/run
đều chặn / đợi lệnh kết thúc: stackoverflow.com/a/14059648/4752883
os.system
tương đương với system
lệnh Unix , trong khi subprocess
là một mô-đun trợ giúp được tạo ra để cung cấp nhiều tiện ích được cung cấp bởi các Popen
lệnh với giao diện dễ kiểm soát và dễ dàng hơn. Chúng được thiết kế tương tự như lệnh Unix Popen .
system()
thực hiện một lệnh được chỉ định trong lệnh bằng cách gọi/bin/sh -c command
và trả về sau khi lệnh đã hoàn thành
Trong khi:
Các
popen()
chức năng mở ra một quá trình bằng cách tạo ra một đường ống, forking, và cách gọi vỏ.
Nếu bạn đang nghĩ nên sử dụng cái nào, thì hãy subprocess
chắc chắn sử dụng vì bạn có tất cả các phương tiện để thực hiện, cộng với quyền kiểm soát bổ sung đối với quy trình.
Quy trình con dựa trên popen2 và như vậy có một số ưu điểm - có một danh sách đầy đủ trong PEP ở đây , nhưng một số là:
Khi chạy python (cpython) trên windows, hệ điều hành <built-in function system>
os.system sẽ thực thi bên dưới màn cửa _wsystem trong khi nếu bạn đang sử dụng hệ điều hành không phải windows, hệ điều hành sẽ sử dụng hệ thống .
Ngược lại, Popen nên sử dụng CreateProcess trên windows và _posixsubprocess.fork_exec trong hệ điều hành dựa trên posix.
Điều đó nói rằng, một lời khuyên quan trọng đến từ tài liệu hệ thống os.system , cho biết:
Mô-đun quy trình con cung cấp các phương tiện mạnh mẽ hơn để tạo ra các quy trình mới và truy xuất kết quả của chúng; sử dụng mô-đun đó sẽ thích hợp hơn sử dụng chức năng này. Xem phần Thay thế các chức năng cũ hơn bằng phần Mô-đun quy trình con trong tài liệu quy trình con để biết một số công thức hữu ích.
sts = p.wait()
thay cho dòng cuối cùng.