Hướng dẫn python subprocess tutorial - hướng dẫn xử lý con python | Remy Preece Whyte

Thực hiện một chương trình trẻ em trong một quy trình mới. Trên Unix, lớp sử dụng hành vi giống như ____ 2 để thực hiện chương trình trẻ em. Trên Windows, lớp sử dụng chức năng Windows CreateProcess(). Các đối số cho Popen như sau.

Args nên là một chuỗi các đối số chương trình hoặc một chuỗi khác. Theo mặc định, chương trình thực thi là mục đầu tiên trong args nếu args là một chuỗi. Nếu Args là một chuỗi, việc giải thích phụ thuộc vào nền tảng và được mô tả dưới đây. Xem các đối số shell và thực thi để biết sự khác biệt bổ sung so với hành vi mặc định. Trừ khi có quy định khác, nên truyền ARGS như một chuỗi.

Trên Unix, nếu Args là một chuỗi, chuỗi được hiểu là tên hoặc đường dẫn của chương trình để thực thi. Tuy nhiên, điều này chỉ có thể được thực hiện nếu không chuyển các đối số cho chương trình.

Ghi chú

shlex.split() có thể hữu ích khi xác định mã thông báo chính xác cho Args, đặc biệt là trong các trường hợp phức tạp:

>>> import shlex, subprocess
>>> command_line = raw_input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!

Lưu ý cụ thể rằng các tùy chọn (chẳng hạn như -input) và các đối số (như trứng.txt) được phân tách bằng khoảng trắng trong shell đi trong các yếu tố danh sách riêng biệt, trong khi các đối số cần trích dẫn hoặc rút lại khi sử dụng Tên tệp chứa khoảng trắng hoặc lệnh Echo được hiển thị ở trên) là các yếu tố danh sách đơn.

Trên Windows, nếu Args là một chuỗi, nó sẽ được chuyển đổi thành một chuỗi theo cách được mô tả trong việc chuyển đổi một chuỗi đối số thành một chuỗi trên Windows. Điều này là do CreateProcess() cơ bản hoạt động trên các chuỗi.Converting an argument sequence to a string on Windows. This is because the underlying CreateProcess() operates on strings.

Đối số shell (mặc định là False) chỉ định xem có nên sử dụng shell làm chương trình để thực thi hay không. Nếu shell là True, bạn nên truyền args dưới dạng một chuỗi chứ không phải là một chuỗi.

Trên UNIX với shell=True, shell mặc định là

Popen(['/bin/sh', '-c', args[0], args[1], ...])
0. Nếu args là một chuỗi, chuỗi chỉ định lệnh để thực thi thông qua shell. Điều này có nghĩa là chuỗi phải được định dạng chính xác như khi được gõ tại dấu nhắc shell. Điều này bao gồm, ví dụ, trích dẫn hoặc chao đảo thoát khỏi các tên tệp với không gian trong đó. Nếu Args là một chuỗi, mục đầu tiên chỉ định chuỗi lệnh và bất kỳ mục bổ sung nào sẽ được coi là đối số bổ sung cho chính shell. Điều đó có nghĩa là, Popen có tương đương với:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

Trên Windows với shell=True, biến môi trường

Popen(['/bin/sh', '-c', args[0], args[1], ...])
3 chỉ định shell mặc định. Lần duy nhất bạn cần chỉ định shell=True trên Windows là khi lệnh bạn muốn thực thi được tích hợp vào shell (ví dụ: dir hoặc sao chép). Bạn không cần shell=True để chạy tệp hàng loạt hoặc thực thi dựa trên bảng điều khiển.
Popen(['/bin/sh', '-c', args[0], args[1], ...])
3 environment variable specifies the default shell. The only time you need to specify shell=True on Windows is when the command you wish to execute is built into the shell (e.g. dir or copy). You do not need shell=True to run a batch file or console-based executable.

Cảnh báo

Vượt qua shell=True có thể là một mối nguy hiểm bảo mật nếu kết hợp với đầu vào không đáng tin cậy. Xem cảnh báo theo các đối số thường xuyên được sử dụng để biết chi tiết.Frequently Used Arguments for details.

Bufsize, nếu được đưa ra, có cùng ý nghĩa với đối số tương ứng với hàm Open in () tích hợp:

Popen(['/bin/sh', '-c', args[0], args[1], ...])
7 có nghĩa là không bị ảnh hưởng,
Popen(['/bin/sh', '-c', args[0], args[1], ...])
8 có nghĩa là được đệm dòng, bất kỳ giá trị dương nào khác có nghĩa là sử dụng bộ đệm (xấp xỉ) kích thước đó. Một bufsize âm có nghĩa là sử dụng mặc định hệ thống, thường có nghĩa là được đệm hoàn toàn. Giá trị mặc định cho BufSize là
Popen(['/bin/sh', '-c', args[0], args[1], ...])
7 (không bị ảnh hưởng).

Ghi chú

shlex.split() có thể hữu ích khi xác định mã thông báo chính xác cho Args, đặc biệt là trong các trường hợp phức tạp:

Lưu ý cụ thể rằng các tùy chọn (chẳng hạn như -input) và các đối số (như trứng.txt) được phân tách bằng khoảng trắng trong shell đi trong các yếu tố danh sách riêng biệt, trong khi các đối số cần trích dẫn hoặc rút lại khi sử dụng Tên tệp chứa khoảng trắng hoặc lệnh Echo được hiển thị ở trên) là các yếu tố danh sách đơn.ps. If shell=True, on Unix the executable argument specifies a replacement shell for the default

Popen(['/bin/sh', '-c', args[0], args[1], ...])
0.

Trên Windows, nếu Args là một chuỗi, nó sẽ được chuyển đổi thành một chuỗi theo cách được mô tả trong việc chuyển đổi một chuỗi đối số thành một chuỗi trên Windows. Điều này là do CreateProcess() cơ bản hoạt động trên các chuỗi.

Đối số shell (mặc định là False) chỉ định xem có nên sử dụng shell làm chương trình để thực thi hay không. Nếu shell là True, bạn nên truyền args dưới dạng một chuỗi chứ không phải là một chuỗi.

Nếu Close_FDS là đúng, tất cả các mô tả tệp ngoại trừ

Popen(['/bin/sh', '-c', args[0], args[1], ...])
7,
Popen(['/bin/sh', '-c', args[0], args[1], ...])
8 và CreateProcess()0 sẽ bị đóng trước khi quá trình con được thực thi. (Chỉ Unix). Hoặc, trên Windows, nếu Close_FDS là đúng thì sẽ không có tay cầm nào được kế thừa bởi quy trình con. Lưu ý rằng trên Windows, bạn không thể đặt Close_fds thành True và cũng chuyển hướng các tay cầm tiêu chuẩn bằng cách đặt stdin, stdout hoặc stderr.

Nếu CWD không phải là os.execvp()4, thư mục hiện tại của trẻ con sẽ được thay đổi thành CWD trước khi nó được thực thi. Lưu ý rằng thư mục này không được xem xét khi tìm kiếm thực thi, vì vậy bạn có thể chỉ định đường dẫn chương trình liên quan đến CWD.

Nếu env không phải là os.execvp()4, thì đó phải là một ánh xạ xác định các biến môi trường cho quy trình mới; Chúng được sử dụng thay vì kế thừa môi trường quy trình hiện tại, đây là hành vi mặc định.

Ghi chú

Nếu được chỉ định, Env phải cung cấp bất kỳ biến nào cần thiết cho chương trình để thực thi. Trên Windows, để chạy tập hợp cạnh nhau, env được chỉ định phải bao gồm CreateProcess()3 hợp lệ.must include a valid CreateProcess()3.

Nếu Universal_Newlines là True, tệp đối tượng STDOUT và STDERR được mở dưới dạng tệp văn bản ở chế độ Newlines Universal. Các dòng có thể bị chấm dứt bởi bất kỳ CreateProcess()5 nào, quy ước cuối dòng Unix, CreateProcess()6, Công ước Macintosh cũ hoặc CreateProcess()7, Công ước Windows. Tất cả các biểu diễn bên ngoài này được xem là CreateProcess()5 bởi chương trình Python.universal newlines mode. Lines may be terminated by any of CreateProcess()5, the Unix end-of-line convention, CreateProcess()6, the old Macintosh convention or CreateProcess()7, the Windows convention. All of these external representations are seen as CreateProcess()5 by the Python program.

Ghi chú

Nếu được chỉ định, Env phải cung cấp bất kỳ biến nào cần thiết cho chương trình để thực thi. Trên Windows, để chạy tập hợp cạnh nhau, env được chỉ định phải bao gồm CreateProcess()3 hợp lệ.

Nếu Universal_Newlines là True, tệp đối tượng STDOUT và STDERR được mở dưới dạng tệp văn bản ở chế độ Newlines Universal. Các dòng có thể bị chấm dứt bởi bất kỳ CreateProcess()5 nào, quy ước cuối dòng Unix, CreateProcess()6, Công ước Macintosh cũ hoặc CreateProcess()7, Công ước Windows. Tất cả các biểu diễn bên ngoài này được xem là CreateProcess()5 bởi chương trình Python.