Shell True trong quy trình con Python là gì?

args phải là một chuỗi các đối số của chương trình hoặc một chuỗi duy nhất. 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, thì việc giải thích phụ thuộc vào nền tảng và được mô tả bên dưới. Xem trình bao và các đối số thực thi để biết thêm sự khác biệt so với hành vi mặc định. Trừ khi có quy định khác, bạn nên chuyển args dưới dạng chuỗi

Trên Unix, nếu args là một chuỗi thì chuỗi được hiểu là tên hoặc đường dẫn của chương trình sẽ thực thi. Tuy nhiên, điều này chỉ có thể thực hiện được nếu không truyền đố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 các đối số, đặ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!

Đặc biệt lưu ý rằng các tùy chọn [chẳng hạn như -input] và đối số [chẳng hạn như trứng. txt] được phân tách bằng khoảng trắng trong trình bao sẽ nằm trong các phần tử danh sách riêng biệt, trong khi các đối số cần trích dẫn hoặc thoát dấu gạch chéo ngược khi được sử dụng trong trình bao [chẳng hạn như tên tệp chứa khoảng trắng hoặc lệnh echo được hiển thị ở trên] là các phần tử danh sách đơn lẻ

Trên Windows, nếu args là một chuỗi, nó sẽ được chuyển đổi thành chuỗi theo cách được mô tả trong Chuyển đổi chuỗi đối số thành 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ố trình bao [mặc định là Sai] chỉ định có sử dụng trình bao làm chương trình để thực thi hay không. Nếu shell là True, bạn nên chuyển args dưới dạng chuỗi thay vì dưới dạng chuỗi

Trên Unix với shell=True , hệ vỏ mặc định là /bin/sh. If args is a string, the string specifies the command to execute through the shell. This means that the string must be formatted exactly as it would be when typed at the shell prompt. This includes, for example, quoting or backslash escaping filenames with spaces in them. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself. That is to say, Popen thực hiện tương đương với.

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

Trên Windows với shell=True , COMSPEC . 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 sẵn trong trình bao [e. g. thư mục hoặc bản sao]. Bạn không cần shell=True để chạy tệp bó hoặc tệp thực thi dựa trên bảng điều khiển.

Cảnh báo

Truyền shell=True có thể là một mối nguy hiểm về 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 trong Đối số thường được sử dụng để biết chi tiết.

bufsize, nếu được cung cấp, có cùng ý nghĩa với đối số tương ứng của hàm open[] tích hợp. 0 có nghĩa là không có bộ đệm, 1 có nghĩa là dòng được đệm, bất kỳ giá trị dương nào khác có nghĩa là . Bufsize âm có nghĩa là sử dụng mặc định của hệ thống, thường có nghĩa là được lưu vào bộ đệm đầy đủ. Giá trị mặc định cho kích thước bufsize là 0 [không có bộ đệm].

Ghi chú

Nếu bạn gặp sự cố về hiệu suất, bạn nên thử kích hoạt tính năng lưu vào bộ đệm bằng cách đặt kích thước bufsize thành -1 hoặc một giá trị dương đủ lớn [chẳng hạn như 4096]

Đối số thực thi chỉ định một chương trình thay thế để thực thi. Nó rất hiếm khi cần thiết. Khi shell=False , tệp thực thi sẽ thay thế chương trình để thực thi được chỉ định bởi các đối số. Tuy nhiên, các đối số ban đầu vẫn được chuyển đến chương trình. Hầu hết các chương trình coi chương trình được chỉ định bởi args là tên lệnh, sau đó có thể khác với chương trình thực sự được thực thi. Trên Unix, tên args trở thành tên hiển thị cho tệp thực thi trong các tiện ích như ps. Nếu shell=True , trên Unix, đối số thực thi chỉ định trình bao thay thế cho /bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh.

stdin, stdout và stderr chỉ định tương ứng đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và xử lý tệp lỗi tiêu chuẩn của chương trình đã thực hiện. Các giá trị hợp lệ là PIPE , bộ mô tả tệp hiện có [số nguyên dương], đối tượng tệp hiện có và Không có< . . PIPE cho biết rằng nên tạo một đường ống mới cho phần tử con. Với cài đặt mặc định là Không có , sẽ không có chuyển hướng nào xảy ra; . Ngoài ra, thiết bị xuất chuẩn có thể là STDOUT , điều này cho biết rằng dữ liệu thiết bị xuất chuẩn từ quy trình con phải được ghi vào cùng một tệp xử lý như đối với thiết bị xuất chuẩn.

Nếu preexec_fn được đặt thành một đối tượng có thể gọi được, thì đối tượng này sẽ được gọi trong tiến trình con ngay trước khi tiến trình con được thực thi. [Chỉ Unix]

Nếu close_fds là true, tất cả các bộ mô tả tệp ngoại trừ 0 , 1 and 2 will be closed before the child process is executed. [Unix only]. Or, on Windows, if close_fds is true then no handles will be inherited by the child process. Note that on Windows, you cannot set close_fds to true and also redirect the standard handles by setting stdin, stdout or stderr.

Nếu cwd không phải là Không có , thư mục hiện tại của con sẽ được đổ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 tệp thực thi, vì vậy bạn không thể chỉ định đường dẫn của chương trình liên quan đến cwd.

Nếu env không phải là Không có , 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; .

Ghi chú

Nếu được chỉ định, env phải cung cấp bất kỳ biến nào cần thiết để chương trình thực thi. Trên Windows, để chạy một assembly song song, env đã chỉ định phải bao gồm một SystemRoot hợp lệ.

Nếu universal_newlines là True , đối tượng tệp stdout và stderr được mở dưới dạng tệp văn bản ở chế độ dòng mới phổ quát. Các dòng có thể bị kết thúc bởi bất kỳ '\n' , quy ước cuối dòng Unix, '\ . Tất cả các biểu diễn bên ngoài này đều được chương trình Python xem là , the old Macintosh convention or '\r\n', the Windows convention. All of these external representations are seen as '\n' .

Ghi chú

Tính năng này chỉ khả dụng nếu Python được xây dựng với hỗ trợ dòng mới chung [mặc định]. Ngoài ra, thuộc tính dòng mới của đối tượng tệp stdout , stdin và < . stderr are not updated by the communicate[] method.

Nếu được cung cấp, startupinfo sẽ là một đối tượng STARTUPINFO , đối tượng này được truyền cho CreateProcess< . các cờ tạo, nếu được cung cấp, có thể là function. creationflags, if given, can be CREATE_NEW_CONSOLE hoặc CREATE_NEW_PROCESS_GROUP . [Chỉ dành cho Windows]

17. 1. 1. 3. Ngoại lệ¶

Các ngoại lệ phát sinh trong tiến trình con, trước khi chương trình mới bắt đầu thực thi, sẽ được phát sinh lại trong tiến trình cha. Ngoài ra, đối tượng ngoại lệ sẽ có một thuộc tính bổ sung được gọi là child_traceback , là một chuỗi chứa thông tin truy nguyên theo quan điểm của trẻ.

Ngoại lệ phổ biến nhất được đưa ra là Lỗi OS . Ví dụ, điều này xảy ra khi cố gắng thực thi một tệp không tồn tại. Ứng dụng nên chuẩn bị cho OSError ngoại lệ.

A ValueError sẽ tăng lên nếu Popen được gọi .

check_call[]check_output[] sẽ tăng . if the called process returns a non-zero return code.

17. 1. 1. 4. Bảo vệ¶

Không giống như một số chức năng popen khác, việc triển khai này sẽ không bao giờ gọi ngầm hệ thống. Điều này có nghĩa là tất cả các ký tự, bao gồm cả siêu ký tự shell, có thể được chuyển an toàn cho các tiến trình con. Rõ ràng, nếu trình bao được gọi một cách rõ ràng, thì trách nhiệm của ứng dụng là đảm bảo rằng tất cả các khoảng trắng và ký tự đại diện được trích dẫn một cách thích hợp

17. 1. 2. Đồ vật Popen¶

Các thực thể của lớp Popen có các phương thức sau.

giáo hoàng. thăm dò ý kiến[]¶

Kiểm tra xem tiến trình con đã kết thúc chưa. Đặt và trả về thuộc tính returncode .

giáo hoàng. đợi đã[]¶

Chờ quá trình con kết thúc. Đặt và trả về thuộc tính returncode .

Cảnh báo

Điều này sẽ gây bế tắc khi sử dụng stdout=PIPE và/hoặc stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate[] để tránh điều đó.

giáo hoàng. giao tiếp [đầu vào = Không]¶

Tương tác với quy trình. Gửi dữ liệu đến stdin. Đọc dữ liệu từ thiết bị xuất chuẩn và thiết bị xuất chuẩn, cho đến khi đạt đến cuối tệp. Đợi quá trình kết thúc. Đối số đầu vào tùy chọn phải là một chuỗi được gửi tới tiến trình con hoặc Không có , nếu không có dữ liệu nào được gửi tới tiến trình con.

communicate[] trả về một bộ [stdoutdata, stderrdata].

Lưu ý rằng nếu bạn muốn gửi dữ liệu đến stdin của quy trình, bạn cần tạo đối tượng Popen với stdin=PIPE . Tương tự, để lấy bất cứ thứ gì khác ngoài None trong bộ dữ liệu kết quả, bạn cần đưa ra stdout=PIPE and/or stderr=PIPE too.

Ghi chú

Dữ liệu đọc được lưu vào bộ nhớ đệm, vì vậy không sử dụng phương pháp này nếu kích thước dữ liệu lớn hoặc không giới hạn

giáo hoàng. send_signal[tín hiệu]¶

Gửi tín hiệu tín hiệu cho trẻ

Ghi chú

Trên Windows, SIGTERM là bí danh của terminate[] . CTRL_C_EVENT và CTRL_BREAK_EVENT có thể được gửi đến các quy trình đã bắt đầu bằng tham số Creationflags bao gồm CREATE_NEW_PROCESS_GROUP.

Mới trong phiên bản 2. 6

giáo hoàng. chấm dứt[]¶

Dừng đứa trẻ. Trên hệ điều hành Posix, phương thức gửi SIGTERM cho con. Trên Windows, chức năng Win32 API TerminateProcess[] được gọi để dừng ứng dụng con.

Mới trong phiên bản 2. 6

giáo hoàng. giết chết[]¶

Giết đứa trẻ. Trên hệ điều hành Posix, hàm gửi SIGKILL cho con. Trên Windows kill[] là bí danh của terminate[] .

Mới trong phiên bản 2. 6

Các thuộc tính sau đây cũng có sẵn

Cảnh báo

Sử dụng giao tiếp[] thay vì . tiêu chuẩn. viết , . tiêu chuẩn. đọc hoặc . tiêu chuẩn. đọc để tránh bế tắc do bất kỳ bộ đệm ống hệ điều hành nào khác lấp đầy và chặn tiến trình con.

giáo hoàng. stdin¶

Nếu đối số stdin là PIPE , thì thuộc tính này là một đối tượng tệp cung cấp đầu vào cho tiến trình con. Mặt khác, đó là Không .

giáo hoàng. tiêu chuẩn¶

Nếu đối số thiết bị xuất chuẩn là PIPE , thì thuộc tính này là một đối tượng tệp cung cấp đầu ra từ tiến trình con. Mặt khác, đó là Không .

giáo hoàng. stderr¶

Nếu đối số stderr là PIPE , thì thuộc tính này là một đối tượng tệp cung cấp đầu ra lỗi từ quy trình con. Mặt khác, đó là Không .

giáo hoàng. pid¶

ID tiến trình của tiến trình con

Lưu ý rằng nếu bạn đặt đối số trình bao thành True , thì đây là ID tiến trình của trình bao được sinh ra.

giáo hoàng. mã trả về¶

Mã trả về con, được đặt bởi poll[]wait[] [and indirectly by communicate[]]. A None cho biết quá trình chưa kết thúc.

Giá trị âm -N cho biết rằng con đã bị kết thúc bởi tín hiệu N [Unix only].

17. 1. 3. Trình trợ giúp Windows Popen¶

Lớp STARTUPINFO và các hằng số sau chỉ khả dụng trên Windows.

quy trình con của lớp. THÔNG TIN KHỞI NGHIỆP¶

Hỗ trợ một phần cấu trúc STARTUPINFO của Windows được sử dụng để tạo Popen .

dwFlags¶

Trường bit xác định xem các thuộc tính STARTUPINFO nhất định có được sử dụng hay không khi quy trình tạo cửa sổ.

si = subprocess.STARTUPINFO[]
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW

hStdInput¶

Nếu dwFlags chỉ định STARTF_USESTDHANDLES , thuộc tính này là . Nếu STARTF_USESTDHANDLES không được chỉ định, mặc định cho đầu vào tiêu chuẩn là bộ đệm bàn phím.

hStdOutput¶

Nếu dwFlags chỉ định STARTF_USESTDHANDLES , thuộc tính này là . Mặt khác, thuộc tính này bị bỏ qua và mặc định cho đầu ra tiêu chuẩn là bộ đệm của cửa sổ giao diện điều khiển.

hStdError¶

Nếu dwFlags chỉ định STARTF_USESTDHANDLES , thuộc tính này là . Mặt khác, thuộc tính này bị bỏ qua và mặc định cho lỗi tiêu chuẩn là bộ đệm của cửa sổ giao diện điều khiển.

wShowWindow¶

Nếu dwFlags chỉ định STARTF_USESHOWWINDOW , thuộc tính này có thể là . Mặt khác, thuộc tính này bị bỏ qua. nCmdShow parameter for the ShowWindow function, except for SW_SHOWDEFAULT. Otherwise, this attribute is ignored.

SW_HIDE được cung cấp cho thuộc tính này. Nó được sử dụng khi Popen được gọi với shell=True .

17. 1. 3. 1. Hằng số¶

Mô-đun quy trình con hiển thị các hằng số sau.

quy trình con. STD_INPUT_HANDLE¶

Thiết bị đầu vào tiêu chuẩn. Ban đầu, đây là bộ đệm đầu vào của bảng điều khiển, CONIN$ .

quy trình con. STD_OUTPUT_HANDLE¶

Thiết bị đầu ra tiêu chuẩn. Ban đầu, đây là bộ đệm màn hình bảng điều khiển đang hoạt động, CONOUT$ .

quy trình con. STD_ERROR_HANDLE¶

Thiết bị lỗi tiêu chuẩn. Ban đầu, đây là bộ đệm màn hình bảng điều khiển đang hoạt động, CONOUT$ .

quy trình con. SW_ẨN¶

Ẩn cửa sổ. Một cửa sổ khác sẽ được kích hoạt

quy trình con. STARTF_USESTDHANDLES¶

Chỉ định rằng STARTUPINFO. hStdInput , STARTUPINFO. hStdOutputSTARTUPINFO. thuộc tính hStdError chứa thông tin bổ sung.

quy trình con. STARTF_USESHOWWINDOW¶

Chỉ định rằng STARTUPINFO. Thuộc tính wShowWindow chứa thông tin bổ sung.

quy trình con. CREATE_NEW_CONSOLE¶

Quy trình mới có bảng điều khiển mới, thay vì kế thừa bảng điều khiển của cha mẹ nó [mặc định]

Cờ này luôn được đặt khi Popen được tạo bằng shell=True.

quy trình con. CREATE_NEW_PROCESS_GROUP¶

A Popen creationflags để chỉ định rằng một nhóm quy trình mới sẽ được tạo. Cờ này là cần thiết để sử dụng os. kill[] trên quy trình con.

Cờ này bị bỏ qua nếu CREATE_NEW_CONSOLE được chỉ định.

17. 1. 4. Thay thế các chức năng cũ hơn bằng quy trình con Mô-đun¶

Trong phần này, “a trở thành b” có nghĩa là b có thể được dùng để thay thế cho a

Ghi chú

Tất cả các hàm “a” trong phần này đều bị lỗi [ít nhiều] một cách âm thầm nếu không tìm thấy chương trình đã thực thi; . OSError instead.

Ngoài ra, việc thay thế bằng cách sử dụng check_output[] sẽ không thành công với CalledProcessError if the requested operation produces a non-zero return code. The output is still available as the đầu ra của ngoại lệ đã nêu.

Trong các ví dụ sau, chúng tôi giả định rằng các hàm liên quan đã được nhập từ mô-đun quy trình con .

17. 1. 4. 1. Thay thế /bin/sh shell backquote¶

output=`mycmd myarg`
# becomes
output = check_output[["mycmd", "myarg"]]

17. 1. 4. 2. Thay thế đường ống vỏ¶

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
0

các p1. tiêu chuẩn. close[] sau khi bắt đầu p2 là điều quan trọng để p1 nhận được SIGPIPE nếu p2 thoát trước p1

Ngoài ra, đối với đầu vào đáng tin cậy, hỗ trợ đường ống riêng của trình bao vẫn có thể được sử dụng trực tiếp

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
1

17. 1. 4. 3. Đang thay thế os. hệ thống[]

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
2

ghi chú

  • Gọi chương trình thông qua trình bao thường không bắt buộc

Một ví dụ thực tế hơn sẽ như thế này

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
3

17. 1. 4. 4. Thay thế os. sinh sản gia đình¶

Ví dụ P_NOWAIT

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
4

ví dụ P_WAIT

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
5

Ví dụ véc tơ

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
6

Ví dụ về môi trường

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
7

17. 1. 4. 5. Đang thay thế os. popen[] , os. popen2[] , os. popen3[]

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
8

>>> subprocess.call[["ls", "-l"]]
0

>>> subprocess.call["exit 1", shell=True]
1
9

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

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

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

Trên Unix, hệ điều hành. popen2, hệ điều hành. popen3 và hệ điều hành. popen4 cũng chấp nhận một chuỗi làm lệnh thực thi, trong trường hợp đó, các đối số sẽ được chuyển trực tiếp đến chương trình mà không cần sự can thiệp của trình bao. Cách sử dụng này có thể được thay thế như sau

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

Xử lý mã trả về dịch như sau

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

17. 1. 4. 6. Thay thế các hàm từ mô-đun popen2

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

Trên Unix, popen2 cũng chấp nhận một chuỗi làm lệnh thực thi, trong trường hợp đó, các đối số sẽ được chuyển trực tiếp đến chương trình mà không cần sự can thiệp của trình bao. Cách sử dụng này có thể được thay thế như sau

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

popen2. Popen3popen2. Popen4 về cơ bản hoạt động như quy trình con. Giáo hoàng , ngoại trừ điều đó.

  • Popen đưa ra một ngoại lệ nếu việc thực thi không thành công.
  • đối số capturestderr được thay thế bằng đối số stderr
  • stdin=PIPEstdout=PIPE phải được chỉ định.
  • popen2 đóng tất cả các bộ mô tả tệp theo mặc định nhưng bạn phải chỉ định close_fds=True với Popen . .

17. 1. 5. Ghi chú¶

17. 1. 5. 1. Chuyển đổi một chuỗi đối số thành một chuỗi trên Windows¶

Trên Windows, một chuỗi đối số được chuyển đổi thành một chuỗi có thể được phân tích cú pháp bằng cách sử dụng các quy tắc sau [tương ứng với các quy tắc được sử dụng bởi thời gian chạy MS C]

Popen trong quy trình con là gì?

Mô-đun quy trình con định nghĩa một lớp, Popen và một vài hàm trình bao sử dụng lớp đó. Trình tạo cho Popen nhận các đối số để thiết lập quy trình mới để cấp độ gốc có thể giao tiếp với nó qua đường dẫn . Nó cung cấp tất cả các chức năng của các mô-đun khác và các chức năng mà nó thay thế, v.v.

Quy trình con Python Popen trả về cái gì?

Hàm Pope . Ngay sau khi bắt đầu, hàm Popen trả về dữ liệu và nó không đợi quá trình con kết thúc. a pointer to a stream that may be used to read from or write to the pipe while also creating a pipe between the calling application and the executed command. Immediately after starting, the Popen function returns data, and it does not wait for the subprocess to finish.

Quy trình con Popen có bị chặn không?

Popen không bị chặn . cuộc gọi và check_call đang bị chặn. Bạn có thể tạo khối đối tượng Popen bằng cách gọi phương thức chờ hoặc giao tiếp của nó.

Đường ống trong quy trình con Python là gì?

PIPE với tư cách là một trong hai người, bạn chỉ định rằng bạn muốn đối tượng Popen kết quả có quyền kiểm soát stdin và/hoặc thiết bị xuất chuẩn của tiến trình con, thông qua các thuộc tính stdin và thiết bị xuất chuẩn của Popen< . .

Chủ Đề