2011-01-27 29 views

Trả lời

58

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

+0

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

+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 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. –

+0

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

19

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
22

subprocess.Popen() là superset nghiêm ngặt của os.system().

+0

Đây là câu trả lời hoàn chỉnh thanh lịch. – Farsheed

18

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.

+0

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

+0

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) –

+0

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. –

0

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.

Các vấn đề liên quan