Sự khác biệt giữa subprocess.Popen và os.system


Câu trả lời:


99

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().


Bạn cũng có thể sử dụng sts = p.wait()thay cho dòng cuối cùng.
Sven Marnach,

1
@JacobMarble, vì vậy, giả sử tôi đang gọi một tập lệnh cạo selen từ một tập lệnh python khác, cái nào trong số này sẽ cho phép tôi hoàn thành tập lệnh cạo và sau đó và chỉ sau đó thực thi dòng mã tiếp theo? Như trong, quá trình cạo của tôi sẽ hoàn thành trước khi quá trình thực hiện có thể tiếp tục.
Prakhar Mohan Srivastava

Cũng có thể đề cập đến stackoverflow.com/questions/3172470/… để chỉ ra rằng bạn nên tránh shell=Truenế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ó.
tripleee,

@PrakharMohanSrivastava Nếu bạn muốn chặn luồng và đợi lệnh hoàn thành công việc của nó, hãy kiểm tra: stackoverflow.com/a/2837319/5252192
AmirHossein

@PrakharMohanSrivastava, nói chung là cả hai os.systemsubprocess.call/popen/runđều chặn / đợi lệnh kết thúc: stackoverflow.com/a/14059648/4752883
alpha_989 Ngày

47

subprocess.Popen()là tập hợp siêu nghiêm ngặt của os.system().


10
Đây là câu trả lời hoàn toàn thanh lịch.
Farsheed

23

os.systemtương đương với systemlệnh Unix , trong khi subprocesslà 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 Popenlệ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 commandvà 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 subprocesschắ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.


được rồi..vậy có cách nào tôi có thể thực thi cả os.system và popen trong windows env không? i am a newbie và cần phải đào sâu hơn ..
Arovit

Có, bạn có thể sử dụng cả os.system và subprocess trong Windows Environment. Hãy nhìn vào các hướng dẫn cơ bản từ effbot.org (Thư viện Python Chuẩn cuốn sách trực tuyến)
Senthil Kumaran

Cẩn thận - nếu bạn đang chạy trên các hệ thống cũ hơn, mô-đun quy trình con sẽ không khả dụng.
Steve Hanov,

21

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à:

  • sử dụng đường ống trong vỏ
  • hỗ trợ dòng mới tốt hơn
  • xử lý tốt hơn các ngoại lệ

2

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.