Câu hỏi Sự khác biệt giữa subprocess.Popen và os.system


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


76
2018-01-27 06:04


gốc




Các câu trả lời:


Nếu bạn kiểm tra phần xử lý 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() với subprocess.Popen():

sts = os.system("mycmd" + " myarg")

... cũng giống như ...

sts = Popen("mycmd" + " myarg", shell=True).wait()

Mã "được cải thiệ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 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ó giúp, hãy nghĩ về subprocess.Popen() như rất linh hoạt os.system().


64
2018-01-27 06:56



Bạn cũng có thể dùng sts = p.wait() thay vì dòng cuối cùng. - Sven Marnach
@ JacobMarble vì vậy giả sử tôi đang gọi một kịch bản cạo selenium từ một kịch bản python khác, cái nào trong số này sẽ cho phép tôi hoàn thành kịch bản lệnh cạo và sau đó và chỉ sau đó thực thi dòng mã tiếp theo? Như trong, cạo của tôi nên hoàn thành trước khi thực hiện có thể tiếp tục. - Prakhar Mohan Srivastava
Có lẽ cũng đề cập đến stackoverflow.com/questions/3172470/… để chỉ ra rằng bạn nên tránh shell=True nếu bạn 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à chờ lệnh để hoàn thành kiểm tra công việc của mình: stackoverflow.com/a/2837319/5252192 - TechJS
@PrakharMohanSrivastava, nói chung cả os.system và subprocess.call/popen/run không chặn / chờ lệnh kết thúc: stackoverflow.com/a/14059648/4752883 - alpha_989


subprocess.Popen() là bộ siêu nghiêm ngặt của os.system().


28
2018-01-27 06:17



Đây là câu trả lời hoàn hảo thanh lịch. - Farsheed


Subprocess dựa trên popen2, và như vậy có một số lợi thế - có một danh sách đầy đủ trong PEP tại đâ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ệ

19
2018-01-27 06:09





os.system tương đương với Unix hệ thống lệnh, trong khi subprocess là một mô-đun trợ giúp được tạo ra để cung cấp nhiều cơ sở được cung cấp bởi các lệnh Popen với giao diện dễ điều khiển hơn. Chúng được thiết kế tương tự như Unix Popen chỉ huy.

system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed

trong khi

The popen() function opens a process by creating a pipe, forking, and invoking the shell.

Nếu bạn đang suy nghĩ, cái nào để sử dụng, sau đó sử dụng subprocess chắc chắn bởi vì bạn có tất cả các cơ sở để thực hiện, cộng thêm kiểm soát quá trình.


18
2018-01-27 07:07



okay..then là có cách nào tôi có thể thực hiện cả os.system và popen trong cửa sổ env? tôi là một người mới và cần đào sâu hơn .. - Arovit
Có, bạn có thể sử dụng cả os.system và subprocess trong Windows Environment. Hãy xem các hướng dẫn cơ bản từ effbot.org (Sách trực tuyến của Thư viện chuẩn Python) - 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 subprocess không có sẵn. - Steve Hanov


Khi chạy python (cpython) trên cửa sổ <built-in function system>  os.system sẽ thực hiện dưới rèm cửa _wsystem trong khi nếu bạn đang sử dụng một os không phải cửa sổ, nó sẽ sử dụng hệ thống.

Ngược lại, Popen nên sử dụng Tạo ra quy trình trên cửa sổ và _posixsubprocess.fork_exec trong các 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ừ os.system tài liệu, nói rằng:

Mô-đun subprocess cung cấp các cơ sở mạnh mẽ hơn cho sinh sản   các quy trình mới và truy xuất kết quả của chúng; sử dụng mô-đun đó là   thích hợp hơn khi sử dụng chức năng này. Xem các chức năng thay thế cũ hơn   với phần mô-đun subprocess trong tài liệu quy trình con   một số công thức nấu ăn hữu ích.


1
2018-03-09 03:19