Sự khác biệt giữa subprocess.Popen() và os.system() là gì?Sự khác biệt giữa subprocess.Popen và os.system
Trả lời
Nếu bạn kiểm tra subprocess section of the Python docs, bạn sẽ nhận thấy có một ví dụ về làm thế nào để thay thế os.system()
với subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... làm điều tương tự 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 bất kỳ điều 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 có ích, hãy suy nghĩ về subprocess.Popen()
là rất linh hoạt os.system()
.
trình con được 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 here, nhưng một số là:
- sử dụng ống trong vỏ hỗ trợ
- tốt hơn newline
- xử lý ngoại lệ tốt hơn
subprocess.Popen() là superset nghiêm ngặt của os.system().
Đây là câu trả lời hoàn chỉnh thanh lịch. – Farsheed
os.system tương đương với lệnh Unix system, trong khi subprocess là mô-đun trợ giúp được tạo để cung cấp nhiều tiện ích được cung cấp bởi 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ư lệnh Unix Popen.
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed
nơi như
The popen() function opens a process by creating a pipe, forking, and invoking the shell.
Nếu bạn đang nghĩ, cái nào để sử dụng, sau đó sử dụng subprocess chắc chắn bởi vì bạn bạn có tất cả cơ sở vật chất để thực hiện, cộng với kiểm soát tốt hơn quá trình này.
okay..đây là có cách nào tôi có thể thực thi cả os.system và popen trong windows env ? Tôi là một newbie 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) –
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. –
Khi chạy python (cpython) trên cửa sổ <built-in function system>
os.system sẽ thực hiệ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 cửa sổ, nó sẽ sử dụng system.
Ngược lại, Popen nên sử dụng CreateProcess trên cửa sổ và _posixsubprocess.fork_exec trong hệ điều hành dựa trên posix.
Điều đó nói rằng, một phần quan trọng của lời khuyên đến từ os.system tài liệu, trong đó nói rằng:
Các module subprocess cung cấp cơ sở vật chất mạnh mẽ hơn để đẻ trứng quy trình mới và lấy kết quả của họ; sử dụng mô-đun đó là thích hợp hơn khi sử dụng chức năng này. Xem Thay thế chức năng cũ hơn với phần Mô-đun quy trình con trong tài liệu quy trình con cho một số công thức nấu ăn hữu ích.
- 1. Sự khác biệt giữa os.system và subprocess gọi
- 2. Sự khác biệt giữa $ (...) và `...`
- 3. Sự khác biệt giữa. và #
- 4. Sự khác biệt giữa $ * và $ @
- 5. Sự khác biệt giữa ". +" Và ". +?"
- 6. Sự khác biệt giữa "**/* /" và "** /"?
- 7. Sự khác biệt giữa = và: =
- 8. Sự khác biệt về sự khác biệt giữa Matplotlib giữa Agg và Cairo
- 9. Sự khác biệt giữa Html.RenderAction và Html.Action
- 10. Sự khác biệt giữa cookie và phiên?
- 11. Sự khác biệt giữa '.' và "." trong java
- 12. Sự khác biệt giữa SimpleDB và S3
- 13. C++ - Sự khác biệt giữa (*). và ->?
- 14. Sự khác biệt giữa offsetHeight và clientHeight
- 15. Sự khác biệt giữa RDLC và SSRS
- 16. Sự khác biệt giữa "\ n" và Environment.NewLine
- 17. Sự khác biệt giữa qt và PyQt4
- 18. Sự khác biệt giữa AForge và OpenCV
- 19. Sự khác biệt giữa toFixed() và toPrecision()?
- 20. sự khác biệt giữa cacao và cocoatouch
- 21. Sự khác biệt giữa smtpClient.send() và smtpClient.SendAsync()?
- 22. Sự khác biệt giữa window.location.host và window.location.hostname
- 23. Sự khác biệt giữa DTLS và TLS
- 24. Sự khác biệt giữa Mealy và Moore
- 25. sự khác biệt giữa createRfcommSocketToServiceRecord và createRfcommSocket
- 26. Sự khác biệt giữa Arrays.sort() và Arrays.parallelSort()
- 27. sự khác biệt giữa orm và pdo
- 28. Sự khác biệt giữa nproc và ulimit?
- 29. Sự khác biệt giữa apc_add và apc_store?
- 30. Sự khác biệt giữa mb_substr và substr
Bạn cũng có thể sử dụng 'sts = p.wait()' thay cho dòng cuối cùng. –
@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 kịch bản lệnh cạo và sau đó chỉ 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. –
Cũng có thể đề cập đến http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess để 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 hàm trợ giúp của nó. – tripleee