Làm thế nào để thiết bị xuất chuẩn hoạt động trong Python?

Nhưng nếu bạn muốn ghi vào Lỗi chuẩn (

print( "Hello Standard Output!" )
1), bạn sẽ phải nhập thư viện
print( "Hello Standard Output!" )
2

import sys

print( "Hello Standard Error!", file=sys.stderr )

1
2
3
import sys

print( "Hello Standard Error!", file=sys.stderr )

Sử dụng print( "Hello Standard Output!" ) 3

Bạn cũng có thể viết thư cho stdout hoặc

print( "Hello Standard Output!" )
1 bằng cách sử dụng các đối tượng tệp
print( "Hello Standard Output!" )
6 và
print( "Hello Standard Output!" )
7

import sys

sys.stdout.write( "Hello Standard Output!\n" )
sys.stderr.write( "Hello Standard Error!\n" )

1
2
3
4
import sys

sys.stdout.write( "Hello Standard Output!\n" )
sys.stderr.write( "Hello Standard Error!\n" )

Trong khi print tự động thêm ký tự xuống dòng

print( "Hello Standard Output!" )
9 ở cuối, với
import sys

print( "Hello Standard Error!", file=sys.stderr )
0 và
import sys

print( "Hello Standard Error!", file=sys.stderr )
1, bạn cần thêm ký tự đó một cách rõ ràng

Mô-đun này cho phép bạn sinh ra các quy trình mới, kết nối với các đường ống đầu vào/đầu ra/lỗi của chúng và lấy mã trả về của chúng. Mô-đun này dự định thay thế một số mô-đun và chức năng cũ hơn

os.system
os.spawn*

Thông tin về cách mô-đun có thể được sử dụng để thay thế các mô-đun và chức năng này có thể được tìm thấy trong các phần sau

Xem thêm

PEP 324 – PEP đề xuất mô-đun quy trình con

không phải Emscripten, không phải WASI

Mô-đun này không hoạt động hoặc không khả dụng trên nền tảng WebAssugging

>>> import shlex, subprocess
>>> command_line = 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!
7 và
>>> import shlex, subprocess
>>> command_line = 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!
8. Xem để biết thêm thông tin

Sử dụng mô-đun

Cách tiếp cận được đề xuất để gọi các quy trình con là sử dụng hàm cho tất cả các trường hợp sử dụng mà nó có thể xử lý. Đối với các trường hợp sử dụng nâng cao hơn, giao diện bên dưới có thể được sử dụng trực tiếp

quy trình con. chạy(args , *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)

Chạy lệnh được mô tả bởi args. Đợi lệnh hoàn thành, sau đó trả về một phiên bản

Các đối số hiển thị ở trên chỉ là những đối số phổ biến nhất, được mô tả bên dưới trong (do đó việc sử dụng ký hiệu chỉ từ khóa trong chữ ký viết tắt). Chữ ký hàm đầy đủ phần lớn giống như chữ ký của hàm tạo - hầu hết các đối số cho hàm này được chuyển qua giao diện đó. (thời gian chờ, đầu vào, kiểm tra và chụp_đầu ra không. )

Nếu capt_output là true, thiết bị xuất chuẩn và thiết bị xuất chuẩn sẽ bị bắt. Khi được sử dụng, đối tượng bên trong sẽ tự động được tạo với

Popen(['/bin/sh', '-c', args[0], args[1], ...])
5 và
Popen(['/bin/sh', '-c', args[0], args[1], ...])
6. Các đối số thiết bị xuất chuẩn và thiết bị xuất chuẩn có thể không được cung cấp cùng lúc với capture_output. Nếu bạn muốn chụp và kết hợp cả hai luồng thành một, hãy sử dụng
Popen(['/bin/sh', '-c', args[0], args[1], ...])
5 và
Popen(['/bin/sh', '-c', args[0], args[1], ...])
8 thay vì capture_output

Đối số hết thời gian chờ được chuyển đến. Nếu hết thời gian chờ, tiến trình con sẽ bị giết và đợi. Ngoại lệ sẽ được kích hoạt lại sau khi quá trình con kết thúc

Đối số đầu vào được chuyển đến và do đó đến stdin của quy trình con. Nếu được sử dụng, nó phải là một chuỗi byte hoặc một chuỗi nếu mã hóa hoặc lỗi được chỉ định hoặc văn bản là đúng. Khi được sử dụng, đối tượng bên trong sẽ tự động được tạo bằng

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
3 và đối số stdin cũng có thể không được sử dụng

Nếu kiểm tra là đúng và quá trình thoát với mã thoát khác không, một ngoại lệ sẽ được đưa ra. Các thuộc tính của ngoại lệ đó giữ các đối số, mã thoát, thiết bị xuất chuẩn và thiết bị xuất chuẩn nếu chúng bị bắt

Nếu mã hóa hoặc lỗi được chỉ định hoặc văn bản là đúng, thì các đối tượng tệp cho stdin, stdout và stderr được mở ở chế độ văn bản bằng cách sử dụng mã hóa và lỗi được chỉ định hoặc mặc định. Đối số universal_newlines tương đương với văn bản và được cung cấp để tương thích ngược. Theo mặc định, các đối tượng tệp được mở ở chế độ nhị phân

Nếu env không phải là

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, thì nó phải là ánh xạ xác định các biến môi trường cho quy trình mới; . Nó được chuyển trực tiếp đến. Ánh xạ này có thể là str tới str trên bất kỳ nền tảng nào hoặc byte thành byte trên nền tảng POSIX giống như hoặc

ví dụ

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')

Mới trong phiên bản 3. 5

Đã thay đổi trong phiên bản 3. 6. Đã thêm thông số lỗi và mã hóa

Đã thay đổi trong phiên bản 3. 7. Đã thêm tham số văn bản, dưới dạng bí danh dễ hiểu hơn của universal_newlines. Đã thêm tham số capture_output.

lớp quy trình con. Quy trình đã hoàn thành

Giá trị trả về từ , đại diện cho một quá trình đã kết thúc

tranh luận

Các đối số được sử dụng để khởi chạy quá trình. Đây có thể là một danh sách hoặc một chuỗi

mã trả về

Trạng thái thoát của tiến trình con. Thông thường, trạng thái thoát là 0 cho biết rằng nó đã chạy thành công

Giá trị âm

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
1 cho biết rằng đứa trẻ đã bị chấm dứt bởi tín hiệu
proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
2 (chỉ POSIX)

tiêu chuẩn

Thiết bị xuất chuẩn bị bắt từ tiến trình con. Chuỗi byte hoặc chuỗi nếu được gọi bằng mã hóa, lỗi hoặc văn bản=True.

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6 nếu thiết bị xuất chuẩn không bị bắt

Nếu bạn chạy quy trình với

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
5, thiết bị xuất chuẩn và thiết bị xuất chuẩn sẽ được kết hợp trong thuộc tính này và sẽ là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

tiêu chuẩn

Đã chụp stderr từ tiến trình con. Chuỗi byte hoặc chuỗi nếu được gọi bằng mã hóa, lỗi hoặc văn bản=True.

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6 nếu stderr không bị bắt

check_returncode()

Nếu khác không, tăng một

Mới trong phiên bản 3. 5

quy trình con. DEVNULL

Giá trị đặc biệt có thể được sử dụng làm đối số stdin, stdout hoặc stderr và cho biết rằng tệp đặc biệt sẽ được sử dụng

Mới trong phiên bản 3. 3

quy trình con. ỐNG

Giá trị đặc biệt có thể được sử dụng làm đối số stdin, stdout hoặc stderr và cho biết rằng một đường dẫn đến luồng tiêu chuẩn sẽ được mở. Hữu ích nhất với

quy trình con. STDOUT

Giá trị đặc biệt có thể được sử dụng làm đối số tiêu chuẩn và cho biết rằng lỗi tiêu chuẩn sẽ được xử lý giống như đầu ra tiêu chuẩn

ngoại lệ quy trình con. Lỗi quy trình con

Lớp cơ sở cho tất cả các ngoại lệ khác từ mô-đun này

Mới trong phiên bản 3. 3

ngoại lệ quy trình con. Hết thời gian chờ

Lớp con của , được nâng lên khi hết thời gian chờ trong khi chờ tiến trình con

cmd

Lệnh được sử dụng để sinh ra tiến trình con

hết giờ

Thời gian chờ tính bằng giây

đầu ra

Đầu ra của tiến trình con nếu nó bị bắt bởi hoặc. Nếu không,

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6. Đây luôn là khi bất kỳ đầu ra nào được chụp bất kể cài đặt
run(...).returncode
2. Nó có thể vẫn là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6 thay vì
run(...).returncode
4 khi không quan sát thấy đầu ra

tiêu chuẩn

Bí danh cho đầu ra, đối xứng với

tiêu chuẩn

Đầu ra Stderr của tiến trình con nếu nó bị bắt bởi. Nếu không,

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6. Điều này luôn xảy ra khi đầu ra thiết bị xuất chuẩn được chụp bất kể cài đặt
run(...).returncode
2. Nó có thể vẫn là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6 thay vì
run(...).returncode
4 khi không quan sát thấy đầu ra stderr

Mới trong phiên bản 3. 3

Đã thay đổi trong phiên bản 3. 5. đã thêm các thuộc tính stdout và stderr

ngoại lệ quy trình con. CalledProcessError

Lớp con của , được nâng lên khi một quy trình được chạy bởi , hoặc (với

run(..., check=True)
6) trả về trạng thái thoát khác không

mã trả về

Trạng thái thoát của tiến trình con. Nếu quá trình thoát do tín hiệu, đây sẽ là số tín hiệu âm

cmd

Lệnh được sử dụng để sinh ra tiến trình con

đầu ra

Đầu ra của tiến trình con nếu nó bị bắt bởi hoặc. Nếu không,

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

tiêu chuẩn

Bí danh cho đầu ra, đối xứng với

tiêu chuẩn

Đầu ra Stderr của tiến trình con nếu nó bị bắt bởi. Nếu không,

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

Đã thay đổi trong phiên bản 3. 5. đã thêm các thuộc tính stdout và stderr

Đối số thường được sử dụng

Để hỗ trợ nhiều trường hợp sử dụng khác nhau, hàm tạo (và các hàm tiện lợi) chấp nhận một số lượng lớn các đối số tùy chọn. Đối với hầu hết các trường hợp sử dụng điển hình, nhiều đối số trong số này có thể được để nguyên một cách an toàn ở các giá trị mặc định của chúng. Các đối số thường cần thiết nhất là

args là bắt buộc đối với tất cả các cuộc gọi và phải là một chuỗi hoặc một chuỗi các đối số của chương trình. Việc cung cấp một chuỗi các đối số thường được ưu tiên hơn, vì nó cho phép mô-đun xử lý mọi yêu cầu thoát và trích dẫn các đối số (e. g. để cho phép khoảng trắng trong tên tệp). Nếu truyền một chuỗi đơn, shell phải là (xem bên dưới) hoặc nếu không, chuỗi chỉ cần đặt tên chương trình sẽ được thực thi mà không chỉ định bất kỳ đối số nào

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à , , bộ mô tả tệp hiện có (số nguyên dương), đối tượng tệp hiện có với bộ mô tả tệp hợp lệ và

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6. chỉ ra rằng một đường ống mới cho đứa trẻ nên được tạo. cho biết tệp đặc biệt sẽ được sử dụng. Với cài đặt mặc định là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, 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à , đ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 mã hóa hoặc lỗi được chỉ định hoặc văn bản (còn được gọi là universal_newlines) là đúng, thì các đối tượng tệp stdin, stdout và stderr sẽ được mở ở chế độ văn bản bằng cách sử dụng mã hóa và lỗi được chỉ định trong lệnh gọi hoặc giá trị mặc định cho

Đối với stdin, các ký tự kết thúc dòng

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
14 trong đầu vào sẽ được chuyển thành dấu phân cách dòng mặc định. Đối với thiết bị xuất chuẩn và thiết bị xuất chuẩn, tất cả các kết thúc dòng trong đầu ra sẽ được chuyển đổi thành
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
14. Để biết thêm thông tin, hãy xem tài liệu của lớp khi đối số xuống dòng cho hàm tạo của nó là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

Nếu chế độ văn bản không được sử dụng, stdin, stdout và stderr sẽ được mở dưới dạng luồng nhị phân. Không có chuyển đổi mã hóa hoặc kết thúc dòng nào được thực hiện

Mới trong phiên bản 3. 6. Đã thêm thông số lỗi và mã hóa.

Mới trong phiên bản 3. 7. Đã thêm tham số văn bản làm bí danh cho universal_newlines.

Ghi chú

Thuộc tính dòng mới của tệp đối tượng và không được cập nhật theo phương thức

Nếu shell là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04, lệnh đã chỉ định sẽ được thực thi thông qua shell. Điều này có thể hữu ích nếu bạn đang sử dụng Python chủ yếu cho luồng điều khiển nâng cao mà nó cung cấp trên hầu hết các shell hệ thống và vẫn muốn truy cập thuận tiện vào các tính năng shell khác như ống dẫn shell, ký tự đại diện tên tệp, mở rộng biến môi trường và mở rộng
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
24 tới nhà của người dùng . Tuy nhiên, lưu ý rằng bản thân Python cung cấp việc triển khai nhiều tính năng giống như shell (cụ thể là , , , , , và )

Đã thay đổi trong phiên bản 3. 3. Khi universal_newlines là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04, lớp sử dụng mã hóa thay vì
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
33. Xem lớp để biết thêm thông tin về thay đổi này.

Ghi chú

Đọc phần này trước khi sử dụng

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35

Các tùy chọn này, cùng với tất cả các tùy chọn khác, được mô tả chi tiết hơn trong tài liệu về hàm tạo

Nhà xây dựng Popen

Việc tạo và quản lý quy trình cơ bản trong mô-đun này được xử lý bởi lớp. Nó cung cấp rất nhiều tính linh hoạt để các nhà phát triển có thể xử lý các trường hợp ít phổ biến hơn không có trong các chức năng tiện lợi

lớp quy trình con. Popen(args , bufsize=- 1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1, process_group=None)

Thực thi một chương trình con trong một tiến trình mới. Trên POSIX, lớp sử dụng hành vi giống như để thực thi chương trình con. Trên Windows, lớp sử dụng chức năng Windows

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
39. Các lập luận như sau

args phải là một chuỗi các đối số của chương trình hoặc một chuỗi đơn lẻ hoặ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, 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

Cảnh báo

Để có độ tin cậy tối đa, hãy sử dụng đường dẫn đủ điều kiện cho tệp thực thi. Để tìm kiếm một tên không đủ tiêu chuẩn trên

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
41, hãy sử dụng. Trên tất cả các nền tảng, chuyển qua là cách được đề xuất để khởi chạy lại trình thông dịch Python hiện tại và sử dụng định dạng dòng lệnh
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
44 để khởi chạy mô-đun đã cài đặt

Việc giải quyết đường dẫn của tệp thực thi (hoặc mục đầu tiên của đối số) phụ thuộc vào nền tảng. Đối với POSIX, hãy xem và lưu ý rằng khi giải quyết hoặc tìm kiếm đường dẫn thực thi, cwd sẽ ghi đè thư mục làm việc hiện tại và env có thể ghi đè biến môi trường

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
41. Đối với Windows, hãy xem tài liệu về các tham số
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
47 và
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
48 của WinAPI
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
49 và lưu ý rằng khi giải quyết hoặc tìm kiếm đường dẫn thực thi với
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
50, cwd không ghi đè thư mục làm việc hiện tại và env không thể ghi đè biến môi trường
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
41. Sử dụng một đường dẫn đầy đủ sẽ tránh được tất cả các biến thể này

Một ví dụ về việc chuyển một số đối số cho một chương trình bên ngoài dưới dạng trình tự là

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])

Trên POSIX, 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ú

Có thể không rõ ràng về cách chia lệnh shell thành một chuỗi các đối số, đặc biệt là trong các trường hợp phức tạp. có thể minh họa cách xác định mã thông báo chính xác cho args

>>> import shlex, subprocess
>>> command_line = 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. Điều này là do

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
39 cơ bản hoạt động trên các chuỗi

Đã thay đổi trong phiên bản 3. 6. tham số args chấp nhận một trình bao nếu là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
54 và một chuỗi chứa các đối tượng giống như đường dẫn trên POSIX.

Đã thay đổi trong phiên bản 3. 8. tham số args chấp nhận một trình bao if là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
54 và một chuỗi chứa các byte và đối tượng dạng đường dẫn trên Windows.

Đối số shell (mặc định là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
54) chỉ định có sử dụng shell làm chương trình để thực thi hay không. Nếu shell là
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04, bạn nên chuyển args dưới dạng chuỗi thay vì dưới dạng chuỗi

Trên POSIX với

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35, trình bao mặc định là
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
59. Nếu args là một chuỗi, thì chuỗi đó chỉ định lệnh thực thi thông qua trình bao. Điều này có nghĩa là chuỗi phải được định dạng chính xác như khi nhập vào dấu nhắc trình bao. Điều này bao gồm, ví dụ, trích dẫn hoặc dấu gạch chéo ngược tên tệp thoát với dấu cách trong đó. Nếu đối số 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 trình bao. Điều đó có nghĩa là, tương đương với

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

Trên Windows có

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35, biến môi trường
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
62 chỉ định trình bao mặc định. Lần duy nhất bạn cần chỉ định
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35 trên Windows là khi lệnh bạn muốn thực thi được tích hợp trong trình bao (e. g. thư mục hoặc bản sao). Bạn không cần
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35 để chạy tệp thực thi hoặc tệp thực thi dựa trên bảng điều khiển

Ghi chú

Đọc phần này trước khi sử dụng

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35

bufsize sẽ được cung cấp làm đối số tương ứng cho hàm khi tạo các đối tượng tệp đường dẫn stdin/stdout/stderr

  • >>> subprocess.run(["ls", "-l"])  # doesn't capture output
    CompletedProcess(args=['ls', '-l'], returncode=0)
    
    >>> subprocess.run("exit 1", shell=True, check=True)
    Traceback (most recent call last):
      ...
    subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
    
    >>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
    CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
    stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
    
    67 có nghĩa là không có bộ đệm (đọc và ghi là một cuộc gọi hệ thống và có thể trả về ngắn)

  • >>> subprocess.run(["ls", "-l"])  # doesn't capture output
    CompletedProcess(args=['ls', '-l'], returncode=0)
    
    >>> subprocess.run("exit 1", shell=True, check=True)
    Traceback (most recent call last):
      ...
    subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
    
    >>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
    CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
    stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
    
    68 có nghĩa là dòng được đệm (chỉ sử dụng được nếu
    >>> subprocess.run(["ls", "-l"])  # doesn't capture output
    CompletedProcess(args=['ls', '-l'], returncode=0)
    
    >>> subprocess.run("exit 1", shell=True, check=True)
    Traceback (most recent call last):
      ...
    subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
    
    >>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
    CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
    stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
    
    69 i. e. , ở chế độ văn bản)

  • bất kỳ giá trị dương nào khác có nghĩa là sử dụng bộ đệm có kích thước xấp xỉ đó

  • bufsize âm (mặc định) có nghĩa là mặc định hệ thống của io. DEFAULT_BUFFER_SIZE sẽ được sử dụng

Đã thay đổi trong phiên bản 3. 3. 1. bufsize hiện mặc định là -1 để bật tính năng lưu vào bộ đệm theo mặc định để phù hợp với hành vi mà hầu hết mã mong đợi. Trong các phiên bản trước Python 3. 2. 4 và 3. 3. 1 nó được mặc định không chính xác thành

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
67 không có bộ đệm và cho phép đọc ngắn. Điều này là không cố ý và không phù hợp với hành vi của Python 2 như hầu hết các mã mong đợi.

Đố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

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
50, tệp thực thi sẽ thay thế chương trình để thực thi được chỉ định bởi args. 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 POSIX, 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
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35, trên POSIX, đối số có thể thực thi chỉ định trình bao thay thế cho giá trị mặc định
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
59

Đã thay đổi trong phiên bản 3. 6. tham số thực thi chấp nhận trên POSIX.

Đã thay đổi trong phiên bản 3. 8. tham số thực thi chấp nhận byte và trên Windows.

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à , , một bộ mô tả tệp hiện có (số nguyên dương), một bộ mô tả tệp hợp lệ hiện có và

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6. chỉ ra rằng một đường ống mới cho đứa trẻ nên được tạo. cho biết tệp đặc biệt sẽ được sử dụng. Với cài đặt mặc định là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, 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à , điều này cho biết rằng dữ liệu thiết bị xuất chuẩn từ các ứng dụng sẽ đượ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ỉ POSIX)

Cảnh báo

Tham số preexec_fn KHÔNG AN TOÀN để sử dụng khi có các luồng trong ứng dụng của bạn. Quá trình con có thể bế tắc trước khi exec được gọi

Ghi chú

Nếu bạn cần sửa đổi môi trường cho trẻ, hãy sử dụng tham số env thay vì thực hiện trong preexec_fn. Các tham số start_new_session và process_group sẽ thay thế mã bằng cách sử dụng preexec_fn để gọi hoặc ở phần tử con

Đã thay đổi trong phiên bản 3. 8. Tham số preexec_fn không còn được hỗ trợ trong trình thông dịch phụ. Việc sử dụng tham số trong một trình thông dịch phụ làm tăng. Hạn chế mới có thể ảnh hưởng đến các ứng dụng được triển khai trong mod_wsgi, uWSGI và các môi trường nhúng khác.

Nếu close_fds là true, tất cả các bộ mô tả tệp ngoại trừ

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
67,
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
68 và
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
87 sẽ bị đóng trước khi tiến trình con được thực thi. Mặt khác, khi close_fds là sai, các bộ mô tả tệp tuân theo cờ kế thừa của chúng như được mô tả trong

Trên Windows, nếu close_fds là true thì quy trình con sẽ không kế thừa bộ điều khiển nào trừ khi được chuyển rõ ràng trong phần tử

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
88 của hoặc bằng cách chuyển hướng bộ điều khiển tiêu chuẩn

Đã thay đổi trong phiên bản 3. 2. Giá trị mặc định cho close_fds đã được thay đổi thành giá trị được mô tả ở trên.

Đã thay đổi trong phiên bản 3. 7. Trên Windows, giá trị mặc định cho close_fds đã được thay đổi từ thành khi chuyển hướng các bộ điều khiển tiêu chuẩn. Giờ đây, có thể đặt close_fds thành khi chuyển hướng các tay cầm tiêu chuẩn.

pass_fds là một chuỗi mô tả tệp tùy chọn để tiếp tục mở giữa cha và con. Việc cung cấp bất kỳ pass_fds nào buộc close_fds trở thành. (chỉ POSIX)

Đã thay đổi trong phiên bản 3. 2. Tham số pass_fds đã được thêm vào.

Nếu cwd không phải là

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, hàm sẽ thay đổi thư mục làm việc thành cwd trước khi thực hiện lệnh con. cwd có thể là một chuỗi, byte hoặc đối tượng. Trên POSIX, hàm tìm kiếm tệp thực thi (hoặc cho mục đầu tiên trong đối số) so với cwd nếu đường dẫn thực thi là đường dẫn tương đối

Đã thay đổi trong phiên bản 3. 6. tham số cwd chấp nhận trên POSIX.

Đã thay đổi trong phiên bản 3. 7. tham số cwd chấp nhận a trên Windows.

Đã thay đổi trong phiên bản 3. 8. Tham số cwd chấp nhận đối tượng byte trên Windows.

Nếu restore_signals là true (mặc định) thì tất cả các tín hiệu mà Python đã đặt thành SIG_IGN sẽ được khôi phục thành SIG_DFL trong quy trình con trước khi thực thi. Hiện tại điều này bao gồm các tín hiệu SIGPIPE, SIGXFZ và SIGXFSZ. (chỉ POSIX)

Đã thay đổi trong phiên bản 3. 2. restore_signals đã được thêm.

Nếu start_new_session là true, lệnh gọi hệ thống

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
96 sẽ được thực hiện trong quy trình con trước khi thực thi quy trình con

VỊ TRÍ

Đã thay đổi trong phiên bản 3. 2. start_new_session đã được thêm vào.

Nếu process_group là một số nguyên không âm, lệnh gọi hệ thống

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
97 sẽ được thực hiện trong quy trình con trước khi thực hiện quy trình con

VỊ TRÍ

Đã thay đổi trong phiên bản 3. 11. process_group đã được thêm vào.

Nếu nhóm không phải là

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, lệnh gọi hệ thống setregid() sẽ được thực hiện trong quy trình con trước khi thực thi quy trình con. Nếu giá trị được cung cấp là một chuỗi, nó sẽ được tra cứu thông qua và giá trị trong
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
00 sẽ được sử dụng. Nếu giá trị là một số nguyên, nó sẽ được truyền nguyên văn. (chỉ POSIX)

VỊ TRÍ

Mới trong phiên bản 3. 9

Nếu extra_groups không phải là

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, lệnh gọi hệ thống setgroups() sẽ được thực hiện trong quy trình con trước khi thực thi quy trình con. Các chuỗi được cung cấp trong extra_groups sẽ được tra cứu thông qua và các giá trị trong
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
00 sẽ được sử dụng. Các giá trị số nguyên sẽ được truyền nguyên văn. (chỉ POSIX)

VỊ TRÍ

Mới trong phiên bản 3. 9

Nếu người dùng không phải là

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, lệnh gọi hệ thống setreuid() sẽ được thực hiện trong quy trình con trước khi thực thi quy trình con. Nếu giá trị được cung cấp là một chuỗi, nó sẽ được tra cứu thông qua và giá trị trong
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
06 sẽ được sử dụng. Nếu giá trị là một số nguyên, nó sẽ được truyền nguyên văn. (chỉ POSIX)

VỊ TRÍ

Mới trong phiên bản 3. 9

Nếu umask không âm, lệnh gọi hệ thống umask() sẽ được thực hiện trong tiến trình con trước khi thực thi tiến trình con

VỊ TRÍ

Mới trong phiên bản 3. 9

Nếu env không phải là

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, thì nó phải là ánh xạ xác định các biến môi trường cho quy trình mới; . Ánh xạ này có thể là str tới str trên bất kỳ nền tảng nào hoặc byte thành byte trên nền tảng POSIX giống như hoặc

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 hợp ngữ song song, env được chỉ định phải bao gồm một ____61_______10 hợp lệ

Nếu mã hóa hoặc lỗi được chỉ định hoặc văn bản là đúng, thì các đối tượng tệp stdin, stdout và stderr được mở ở chế độ văn bản với mã hóa và lỗi được chỉ định, như được mô tả ở trên trong. Đối số universal_newlines tương đương với văn bản và được cung cấp để tương thích ngược. Theo mặc định, các đối tượng tệp được mở ở chế độ nhị phân

Mới trong phiên bản 3. 6. mã hóa và lỗi đã được thêm vào.

Mới trong phiên bản 3. 7. văn bản đã được thêm dưới dạng bí danh dễ đọc hơn cho universal_newlines.

Nếu được cung cấp, startupinfo sẽ là một đối tượng, được truyền cho hàm

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
49 bên dưới. các cờ tạo, nếu được cung cấp, có thể là một hoặc nhiều cờ sau

pipesize có thể được sử dụng để thay đổi kích thước của đường ống khi được sử dụng cho stdin, stdout hoặc stderr. Kích thước của đường ống chỉ được thay đổi trên các nền tảng hỗ trợ điều này (chỉ Linux tại thời điểm viết bài này). Các nền tảng khác sẽ bỏ qua thông số này

Mới trong phiên bản 3. 10. Tham số

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
26 đã được thêm vào.

Các đối tượng Popen được hỗ trợ dưới dạng trình quản lý ngữ cảnh thông qua câu lệnh. khi thoát, bộ mô tả tệp tiêu chuẩn bị đóng và quá trình được chờ

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())

Popen và các chức năng khác trong mô-đun này sử dụng nó sẽ tăng một

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
28 với các đối số
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
29,
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
30,
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
31 và
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
32. Giá trị cho
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
30 có thể là một chuỗi hoặc một danh sách các chuỗi, tùy thuộc vào nền tảng

Đã thay đổi trong phiên bản 3. 2. Đã thêm hỗ trợ trình quản lý ngữ cảnh.

Đã thay đổi trong phiên bản 3. 6. Popen destructor hiện đưa ra cảnh báo nếu tiến trình con vẫn đang chạy.

Đã thay đổi trong phiên bản 3. 8. Popen có thể sử dụng trong một số trường hợp để có hiệu suất tốt hơn. Trên Hệ thống con Windows dành cho Linux và Mô phỏng người dùng QEMU, hàm tạo Popen sử dụng không còn đưa ra ngoại lệ đối với các lỗi như chương trình bị thiếu, nhưng quy trình con không thành công với giá trị khác không.

ngoại lệ

Các ngoại lệ được đưa ra trong tiến trình con, trước khi chương trình mới bắt đầu thực thi, sẽ được kích hoạt lại trong tiến trình cha

Ngoại lệ phổ biến nhất được nêu ra là. 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. Các ứng dụng nên chuẩn bị cho các trường hợp ngoại lệ. Lưu ý rằng, khi

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35, đứa trẻ sẽ chỉ được nuôi dưỡng nếu không tìm thấy vỏ đã chọn. Để xác định xem shell không tìm thấy ứng dụng được yêu cầu hay không, cần kiểm tra mã trả về hoặc đầu ra từ quy trình con

A sẽ được nâng lên nếu được gọi với các đối số không hợp lệ

và sẽ tăng nếu quá trình được gọi trả về mã trả về khác không

Tất cả các hàm và phương thức chấp nhận tham số hết thời gian chờ, chẳng hạn như và sẽ tăng nếu hết thời gian chờ trước khi quá trình kết thúc

Tất cả các ngoại lệ được xác định trong mô-đun này đều kế thừa từ

Mới trong phiên bản 3. 3. Lớp cơ sở đã được thêm vào.

Cân nhắc về Bảo mật

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. Nếu trình bao được gọi một cách rõ ràng, thông qua

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35, 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à siêu ký tự được trích dẫn một cách thích hợp để tránh các lỗ hổng. Bật , có thể sử dụng để thoát này

Đối tượng Popen

Các thể hiện của lớp 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. Nếu không, trả về

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

Giáo hoàng. chờ đã(hết thời gian=Không có)

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

Nếu quá trình không kết thúc sau vài giây hết thời gian chờ, hãy đưa ra một ngoại lệ. Bắt ngoại lệ này và thử chờ đợi là an toàn

Ghi chú

Điều này sẽ bế tắc khi sử dụng

Popen(['/bin/sh', '-c', args[0], args[1], ...])
5 hoặc
Popen(['/bin/sh', '-c', args[0], args[1], ...])
6 và quy trình con tạo đủ đầu ra cho một đường ống sao cho nó chặn chờ bộ đệm đường ống của hệ điều hành chấp nhận thêm dữ liệu. Sử dụng khi sử dụng đường ống để tránh điều đó

Ghi chú

Chức năng này được thực hiện bằng cách sử dụng vòng lặp bận (cuộc gọi không chặn và giấc ngủ ngắn). Sử dụng mô-đun để chờ đợi không đồng bộ. thấy

Đã thay đổi trong phiên bản 3. 3. thời gian chờ đã được thêm.

Giáo hoàng. giao tiếp(đầu vào=Không, timeout=None)

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 và đặt thuộc tính. Đối số đầu vào tùy chọn phải là dữ liệu được gửi đến quy trình con hoặc

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6, nếu không có dữ liệu nào được gửi đến quy trình con. Nếu các luồng được mở ở chế độ văn bản, đầu vào phải là một chuỗi. Mặt khác, nó phải là byte

trả về một tuple

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
67. Dữ liệu sẽ là chuỗi nếu luồng được mở ở chế độ văn bản;

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

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
3. Tương tự, để lấy bất kỳ thứ gì khác ngoài
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6 trong bộ dữ liệu kết quả, bạn cũng cần cung cấp
Popen(['/bin/sh', '-c', args[0], args[1], ...])
5 và/hoặc
Popen(['/bin/sh', '-c', args[0], args[1], ...])
6

Nếu quá trình không kết thúc sau vài giây hết thời gian, một ngoại lệ sẽ được đưa ra. Nắm bắt ngoại lệ này và thử lại giao tiếp sẽ không làm mất bất kỳ đầu ra nào

Quá trình con không bị hủy nếu hết thời gian chờ, vì vậy để dọn dẹp đúng cách, một ứng dụng hoạt động tốt nên hủy quá trình con và kết thúc giao tiếp

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

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

Đã thay đổi trong phiên bản 3. 3. thời gian chờ đã được thêm.

Giáo hoàng. send_signal(tín hiệu)

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

Không làm gì nếu quá trình hoàn thành

Ghi chú

Trên Windows, SIGTERM là bí danh của. 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

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
14

Giáo hoàng. chấm dứt()

Dừng lại đứ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 API Win32

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
75 được gọi để dừng con

Giáo hoàng. giết()

Giết đứa trẻ. Trên hệ điều hành POSIX, hàm gửi SIGKILL cho con. Trên Windows là một bí danh cho

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

Giáo hoàng. đối số

Đối số args khi nó được chuyển đến – một chuỗi các đối số chương trình hoặc một chuỗi đơn lẻ

Mới trong phiên bản 3. 3

Giáo hoàng. stdin

Nếu đối số stdin là , thì thuộc tính này là đối tượng luồng có thể ghi được trả về bởi. Nếu đối số mã hóa hoặc lỗi đã được chỉ định hoặc đối số universal_newlines là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04, thì luồng là luồng văn bản, nếu không thì luồng đó là luồng byte. Nếu không có đối số stdin , thì thuộc tính này là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

Giáo hoàng. thiết bị xuất chuẩn

Nếu đối số thiết bị xuất chuẩn là , thì thuộc tính này là một đối tượng luồng có thể đọc được khi được trả về bởi. Đọc từ luồng cung cấp đầu ra từ tiến trình con. Nếu đối số mã hóa hoặc lỗi đã được chỉ định hoặc đối số universal_newlines là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04, thì luồng là luồng văn bản, nếu không thì luồng đó là luồng byte. Nếu không có đối số thiết bị xuất chuẩn, thì thuộc tính này là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

Giáo hoàng. stderr

Nếu đối số stderr là , thì thuộc tính này là một đối tượng luồng có thể đọc được khi được trả về bởi. Đọc từ luồng cung cấp đầu ra lỗi từ tiến trình con. Nếu đối số mã hóa hoặc lỗi đã được chỉ định hoặc đối số universal_newlines là

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04, thì luồng là luồng văn bản, nếu không thì luồng đó là luồng byte. Nếu không có đối số stderr, thì thuộc tính này là
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6

Cảnh báo

Sử dụng thay vì hoặ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. 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

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04, 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 và (và gián tiếp bởi ). Giá trị

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
6 cho biết quá trình chưa kết thúc

Giá trị âm

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
1 cho biết rằng đứa trẻ đã bị chấm dứt bởi tín hiệu
proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
2 (chỉ POSIX)

Trình trợ giúp Windows Popen

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

lớp quy trình con. STARTUPINFO(* , dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)

Hỗ trợ một phần cấu trúc Windows STARTUPINFO được sử dụng để tạo. Các thuộc tính sau có thể được đặt bằng cách chuyển chúng dưới dạng đối số chỉ từ khóa

Đã thay đổi trong phiên bản 3. 7. Hỗ trợ đối số chỉ từ khóa đã được thêm vào.

dwFlags

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

si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW

hStdInput

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

hStdĐầu ra

Nếu chỉ định, thuộc tính này là đầu ra xử lý tiêu chuẩn cho quy trình. 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 chỉ định, thuộc tính này là xử lý lỗi tiêu chuẩn cho quy trình. 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 chỉ định , thuộc tính này có thể là bất kỳ giá trị nào có thể được chỉ định trong tham số

>>> import shlex, subprocess
>>> command_line = 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!
17 cho hàm ShowWindow, ngoại trừ
>>> import shlex, subprocess
>>> command_line = 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!
18. Mặt khác, thuộc tính này bị bỏ qua

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

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
35

lpAttributeList

Từ điển các thuộc tính bổ sung để tạo quy trình như được đưa ra trong

>>> import shlex, subprocess
>>> command_line = 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!
22, xem UpdateProcThreadAttribute

Thuộc tính được hỗ trợ

handle_list

Trình tự xử lý sẽ được kế thừa. close_fds phải đúng nếu không trống

Các tay cầm phải được tạm thời làm cho có thể kế thừa khi được chuyển đến hàm tạo, nếu không sẽ xuất hiện lỗi Windows

>>> import shlex, subprocess
>>> command_line = 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!
26 (87)

Cảnh báo

Trong quy trình đa luồng, hãy thận trọng để tránh rò rỉ các thẻ điều khiển được đánh dấu là có thể kế thừa khi kết hợp tính năng này với các lệnh gọi đồng thời đến các chức năng tạo quy trình khác kế thừa tất cả các thẻ điều khiển, chẳng hạn như. Điều này cũng áp dụng cho chuyển hướng xử lý tiêu chuẩn, tạm thời tạo ra các xử lý kế thừa

Mới trong phiên bản 3. 7

Hằng Windows

Mô-đun 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,

>>> import shlex, subprocess
>>> command_line = 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!
29

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,

>>> import shlex, subprocess
>>> command_line = 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!
30

quy trình con. STD_ERROR_HANDLE

Thiết bị báo 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,

>>> import shlex, subprocess
>>> command_line = 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!
30

quy trình con. SW_HIDE

Ẩ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 các thuộc tính , và chứa thông tin bổ sung

quy trình con. STARTF_USESHOWWINDOW

Chỉ định rằng thuộc tính 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)

quy trình con. CREATE_NEW_PROCESS_GROUP

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để 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 trên quy trình con

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

quy trình con. ABOVE_NORMAL_PRIORITY_CLASS

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng một quy trình mới sẽ có mức độ ưu tiên trên trung bình

Mới trong phiên bản 3. 7

quy trình con. BELOW_NORMAL_PRIORITY_CLASS

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng một quy trình mới sẽ có mức độ ưu tiên dưới mức trung bình

Mới trong phiên bản 3. 7

quy trình con. HIGH_PRIORITY_CLASS

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để xác định rằng quy trình mới sẽ có mức độ ưu tiên cao

Mới trong phiên bản 3. 7

quy trình con. IDLE_PRIORITY_CLASS

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng một quy trình mới sẽ có mức độ ưu tiên nhàn rỗi (thấp nhất)

Mới trong phiên bản 3. 7

quy trình con. NORMAL_PRIORITY_CLASS

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng một quy trình mới sẽ có mức độ ưu tiên bình thường. (vỡ nợ)

Mới trong phiên bản 3. 7

quy trình con. REALTIME_PRIORITY_CLASS

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng quy trình mới sẽ có mức độ ưu tiên theo thời gian thực. Bạn gần như không bao giờ nên sử dụng REALTIME_PRIORITY_CLASS, vì điều này làm gián đoạn các luồng hệ thống quản lý đầu vào chuột, đầu vào bàn phím và xóa đĩa nền. Lớp này có thể phù hợp với các ứng dụng “nói chuyện” trực tiếp với phần cứng hoặc thực hiện các tác vụ ngắn cần ít bị gián đoạn

Mới trong phiên bản 3. 7

quy trình con. CREATE_NO_WINDOW

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng quy trình mới sẽ không tạo cửa sổ

Mới trong phiên bản 3. 7

quy trình con. DETACHED_PROCESS

Một tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng một quy trình mới sẽ không kế thừa bảng điều khiển của cha mẹ nó. Không thể sử dụng giá trị này với CREATE_NEW_CONSOLE

Mới trong phiên bản 3. 7

quy trình con. CREATE_DEFAULT_ERROR_MODE

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng quy trình mới không kế thừa chế độ lỗi của quy trình gọi. Thay vào đó, quy trình mới có chế độ lỗi mặc định. Tính năng này đặc biệt hữu ích cho các ứng dụng shell đa luồng chạy với lỗi cứng bị vô hiệu hóa

Mới trong phiên bản 3. 7

quy trình con. TẠO_BREAKAWAY_FROM_JOB

Tham số

>>> import shlex, subprocess
>>> command_line = 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!
37 để chỉ định rằng một quy trình mới không được liên kết với công việc

Mới trong phiên bản 3. 7

API cấp cao cũ hơn

Trước Python 3. 5, ba chức năng này bao gồm API cấp cao để xử lý con. Bây giờ bạn có thể sử dụng trong nhiều trường hợp, nhưng rất nhiều mã hiện có gọi các chức năng này

quy trình con. gọi(args , *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

Chạy lệnh được mô tả bởi args. Đợi lệnh hoàn thành, sau đó trả về thuộc tính

Thay vào đó, mã cần chụp thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn

run(...).returncode

Để triệt tiêu thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn, hãy cung cấp giá trị là

Các đối số hiển thị ở trên chỉ là một số đối số phổ biến. Chữ ký hàm đầy đủ giống như chữ ký của hàm tạo - hàm này chuyển tất cả các đối số được cung cấp ngoài thời gian chờ trực tiếp đến giao diện đó

Ghi chú

Không sử dụng

Popen(['/bin/sh', '-c', args[0], args[1], ...])
5 hoặc
Popen(['/bin/sh', '-c', args[0], args[1], ...])
6 với chức năng này. Quá trình con sẽ bị chặn nếu nó tạo đủ đầu ra cho một đường ống để lấp đầy bộ đệm đường ống của hệ điều hành vì các đường ống không được đọc từ

Đã thay đổi trong phiên bản 3. 3. thời gian chờ đã được thêm.

quy trình con. check_call(args , *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

Chạy lệnh với đối số. Đợi lệnh hoàn thành. Nếu mã trả về bằng 0 thì trả về, nếu không thì tăng. Đối tượng sẽ có mã trả về trong thuộc tính. Nếu không thể bắt đầu quá trình, nó sẽ lan truyền ngoại lệ đã được nêu ra

Thay vào đó, mã cần chụp thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn

run(..., check=True)

Để triệt tiêu thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn, hãy cung cấp giá trị là

Các đối số hiển thị ở trên chỉ là một số đối số phổ biến. Chữ ký hàm đầy đủ giống như chữ ký của hàm tạo - hàm này chuyển tất cả các đối số được cung cấp ngoài thời gian chờ trực tiếp đến giao diện đó

Ghi chú

Không sử dụng

Popen(['/bin/sh', '-c', args[0], args[1], ...])
5 hoặc
Popen(['/bin/sh', '-c', args[0], args[1], ...])
6 với chức năng này. Quá trình con sẽ bị chặn nếu nó tạo đủ đầu ra cho một đường ống để lấp đầy bộ đệm đường ống của hệ điều hành vì các đường ống không được đọc từ

Đã thay đổi trong phiên bản 3. 3. thời gian chờ đã được thêm.

quy trình con. check_output(args , *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None, **other_popen_kwargs)

Chạy lệnh với các đối số và trả về đầu ra của nó

Nếu mã trả về khác không, nó sẽ tăng. Đối tượng sẽ có mã trả về trong thuộc tính và bất kỳ đầu ra nào trong thuộc tính

Điều này tương đương với

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
0

Các đối số hiển thị ở trên chỉ là một số đối số phổ biến. Chữ ký chức năng đầy đủ phần lớn giống như chữ ký của - hầu hết các đối số được chuyển trực tiếp qua giao diện đó. Tồn tại một sai lệch API so với hành vi. chuyển

>>> import shlex, subprocess
>>> command_line = 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!
82 sẽ hoạt động giống như
>>> import shlex, subprocess
>>> command_line = 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!
83 (hoặc
>>> import shlex, subprocess
>>> command_line = 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!
84, tùy thuộc vào các đối số khác) thay vì sử dụng xử lý tệp đầu vào tiêu chuẩn của cha mẹ

Theo mặc định, chức năng này sẽ trả về dữ liệu dưới dạng byte được mã hóa. Mã hóa thực tế của dữ liệu đầu ra có thể phụ thuộc vào lệnh được gọi, do đó, việc giải mã thành văn bản thường sẽ cần được xử lý ở cấp ứng dụng

Hành vi này có thể bị ghi đè bằng cách đặt văn bản, mã hóa, lỗi hoặc universal_newlines thành

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
04 như được mô tả trong và

Để nắm bắt lỗi tiêu chuẩn trong kết quả, hãy sử dụng

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
5

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
1

Mới trong phiên bản 3. 1

Đã thay đổi trong phiên bản 3. 3. thời gian chờ đã được thêm.

Đã thay đổi trong phiên bản 3. 4. Đã thêm hỗ trợ cho đối số từ khóa đầu vào.

Đã thay đổi trong phiên bản 3. 6. mã hóa và lỗi đã được thêm vào. Xem để biết chi tiết.

Mới trong phiên bản 3. 7. văn bản đã được thêm dưới dạng bí danh dễ đọc hơn cho universal_newlines.

Thay thế các chức năng cũ hơn bằng 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;

Ngoài ra, các thay thế sử dụng sẽ thất bại với a nếu hoạt động được yêu cầu tạo ra mã trả về khác không. Đầu ra vẫn có sẵn dưới dạng thuộc tính của ngoại lệ được nêu

Trong các ví dụ sau, chúng tôi giả sử rằng các chức năng liên quan đã được nhập từ mô-đun

Thay thế thay thế lệnh shell /bin/sh

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
2

trở thành

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
3

Thay vỏ đường ống

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
4

trở thành

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
5

Cuộc gọi

>>> import shlex, subprocess
>>> command_line = 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!
95 sau khi bắt đầu p2 rất 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.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
4

trở thành

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
7

thay thế

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
8

ghi chú

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

  • Giá trị trả về được mã hóa khác với giá trị của

  • Chức năng bỏ qua các tín hiệu SIGINT và SIGQUIT trong khi lệnh đang chạy, nhưng người gọi phải thực hiện việc này một cách riêng biệt khi sử dụng mô-đun

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

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
9

Thay thế gia đình

Ví dụ P_NOWAIT

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
0

ví dụ P_WAIT

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
1

Ví dụ véc tơ

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
2

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

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
3

Thay thế , Popen(['/bin/sh', '-c', args[0], args[1], ...]) 03, Popen(['/bin/sh', '-c', args[0], args[1], ...]) 04

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
4

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
5

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
6

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

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
7

Thay thế các chức năng từ mô-đun Popen(['/bin/sh', '-c', args[0], args[1], ...]) 05

Ghi chú

Nếu đối số cmd cho các hàm popen2 là một chuỗi, thì lệnh được thực thi thông qua /bin/sh. Nếu nó là một danh sách, lệnh được thực hiện trực tiếp

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
8

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
9

Popen(['/bin/sh', '-c', args[0], args[1], ...])
06 và
Popen(['/bin/sh', '-c', args[0], args[1], ...])
07 về cơ bản hoạt động như , ngoại trừ điều đó

  • đưa ra một ngoại lệ nếu thực thi không thành công

  • Đối số capturestderr được thay thế bằng đối số stderr

  • with Popen(["ifconfig"], stdout=PIPE) as proc:
        log.write(proc.stdout.read())
    
    3 và
    Popen(['/bin/sh', '-c', args[0], args[1], ...])
    
    5 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

    Popen(['/bin/sh', '-c', args[0], args[1], ...])
    
    12 để đảm bảo hành vi này trên tất cả các nền tảng hoặc các phiên bản Python trước đây

Chức năng gọi trình bao kế thừa

Mô-đun này cũng cung cấp các chức năng kế thừa sau từ 2. x mô-đun

Popen(['/bin/sh', '-c', args[0], args[1], ...])
14. Các hoạt động này gọi ngầm hệ thống vỏ và không có đảm bảo nào được mô tả ở trên về tính nhất quán xử lý ngoại lệ và bảo mật là hợp lệ đối với các chức năng này

quy trình con. getstatusoutput(cmd , *, encoding=None, errors=None)

Trả về

Popen(['/bin/sh', '-c', args[0], args[1], ...])
15 khi thực thi cmd trong trình bao

Thực thi chuỗi cmd trong trình bao với

Popen(['/bin/sh', '-c', args[0], args[1], ...])
16 và trả về 2-tuple
Popen(['/bin/sh', '-c', args[0], args[1], ...])
15. mã hóa và lỗi được sử dụng để giải mã đầu ra;

Một dòng mới ở cuối bị loại bỏ khỏi đầu ra. Mã thoát của lệnh có thể được hiểu là mã trả về của quy trình con. Thí dụ

>>> import shlex, subprocess
>>> command_line = 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!
0

Hệ điều hành Unix, Windows

Đã thay đổi trong phiên bản 3. 3. 4. Hỗ trợ Windows đã được thêm vào.

Hàm hiện trả về (mã thoát, đầu ra) thay vì (trạng thái, đầu ra) như trong Python 3. 3. 3 và sớm hơn. mã thoát có cùng giá trị với

Mới trong phiên bản 3. 11. Đã thêm đối số mã hóa và lỗi.

quy trình con. getoutput(cmd , *, encoding=None, errors=None)

Trả về đầu ra (thiết bị xuất chuẩn và thiết bị xuất chuẩn) khi thực thi cmd trong trình bao

Like , ngoại trừ mã thoát bị bỏ qua và giá trị trả về là một chuỗi chứa đầu ra của lệnh. Thí dụ

>>> import shlex, subprocess
>>> command_line = 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!
1

Hệ điều hành Unix, Windows

Đã thay đổi trong phiên bản 3. 3. 4. Đã thêm hỗ trợ Windows

Mới trong phiên bản 3. 11. Đã thêm đối số mã hóa và lỗi.

ghi chú

Chuyển đổi chuỗi đối số thành chuỗi trên Windows

Trên Windows, một chuỗi args được chuyển đổi thành một chuỗi có thể được phân tích cú pháp bằ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)

  1. Các đối số được phân định bằng khoảng trắng, là khoảng trắng hoặc tab

  2. Một chuỗi được bao quanh bởi dấu ngoặc kép được hiểu là một đối số, bất kể khoảng trắng có trong đó. Một chuỗi được trích dẫn có thể được nhúng trong một đối số

  3. Dấu ngoặc kép trước dấu gạch chéo ngược được hiểu là dấu ngoặc kép theo nghĩa đen

  4. Dấu gạch chéo ngược được hiểu theo nghĩa đen, trừ khi chúng ngay trước dấu ngoặc kép

  5. Nếu dấu gạch chéo ngược ngay trước dấu ngoặc kép, mỗi cặp dấu gạch chéo ngược được hiểu là dấu gạch chéo ngược theo nghĩa đen. Nếu số dấu gạch chéo ngược là số lẻ, dấu gạch chéo ngược cuối cùng sẽ thoát khỏi dấu ngoặc kép tiếp theo như được mô tả trong quy tắc 3

Xem thêm

Mô-đun cung cấp chức năng phân tích cú pháp và thoát khỏi các dòng lệnh

Vô hiệu hóa việc sử dụng Popen(['/bin/sh', '-c', args[0], args[1], ...]) 21 hoặc Popen(['/bin/sh', '-c', args[0], args[1], ...]) 22

Trên Linux, mặc định sử dụng lệnh gọi hệ thống

Popen(['/bin/sh', '-c', args[0], args[1], ...])
21 trong nội bộ khi an toàn để thực hiện thay vì
Popen(['/bin/sh', '-c', args[0], args[1], ...])
25. Điều này cải thiện đáng kể hiệu suất

Nếu bạn từng gặp phải một tình huống được cho là rất bất thường khi bạn cần ngăn không cho Python sử dụng

Popen(['/bin/sh', '-c', args[0], args[1], ...])
21, bạn có thể đặt thuộc tính
Popen(['/bin/sh', '-c', args[0], args[1], ...])
27 thành giá trị sai

>>> import shlex, subprocess
>>> command_line = 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!
2

Cài đặt này không ảnh hưởng đến việc sử dụng

Popen(['/bin/sh', '-c', args[0], args[1], ...])
22 mà có thể sử dụng
Popen(['/bin/sh', '-c', args[0], args[1], ...])
21 nội bộ trong quá trình triển khai libc của nó. Có một thuộc tính
Popen(['/bin/sh', '-c', args[0], args[1], ...])
30 tương tự nếu bạn cần ngăn việc sử dụng thuộc tính đó

>>> import shlex, subprocess
>>> command_line = 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!
3

Sẽ an toàn khi đặt những thứ này thành false trên bất kỳ phiên bản Python nào. Chúng sẽ không có tác dụng trên các phiên bản cũ hơn khi không được hỗ trợ. Đừng cho rằng các thuộc tính có sẵn để đọc. Bất chấp tên gọi của chúng, giá trị thực không chỉ ra rằng chức năng tương ứng sẽ được sử dụng, chỉ có nghĩa là nó có thể được sử dụng.

Vui lòng gửi các sự cố bất cứ khi nào bạn phải sử dụng các nút riêng tư này để tái tạo sự cố mà bạn đang gặp phải. Liên kết đến vấn đề đó từ một nhận xét trong mã của bạn

Làm thế nào để stdin và stdout hoạt động trong Python?

Đầu vào tiêu chuẩn – Đây là tệp xử lý mà chương trình người dùng đọc để lấy thông tin từ người dùng. Chúng tôi cung cấp đầu vào cho đầu vào tiêu chuẩn (stdin). Đầu ra tiêu chuẩn - Chương trình người dùng ghi thông tin bình thường vào tệp xử lý này. Đầu ra được trả về thông qua đầu ra Tiêu chuẩn (thiết bị xuất chuẩn)

Làm cách nào để in đầu ra bằng thiết bị xuất chuẩn trong Python?

Ghi vào đầu ra tiêu chuẩn ( thiết bị xuất chuẩn ) bằng cách sử dụng in rất đơn giản. .
in ("Xin chào đầu ra tiêu chuẩn. " )
nhập bản in sys ("Xin chào Lỗi tiêu chuẩn. ", tập tin = hệ thống. lỗi chuẩn )
nhập sys sys. tiêu chuẩn. write("Xin chào đầu ra tiêu chuẩn. \n" ) hệ thống. tiêu chuẩn. write("Xin chào Lỗi tiêu chuẩn. \N" )

Python có in ra thiết bị xuất chuẩn không?

Hàm print() của Python nhận dữ liệu python chẳng hạn như số nguyên và chuỗi, đồng thời in các giá trị đó ra tiêu chuẩn . Để nói rằng tiêu chuẩn ra là "văn bản" ở đây có nghĩa là một loạt các dòng, trong đó mỗi dòng là một chuỗi các ký tự với '\n' ký tự dòng mới đánh dấu cuối mỗi dòng. Chuẩn ra tương đối đơn giản.

Bản in có sử dụng thiết bị xuất chuẩn không?

StdOut xóa đầu ra tiêu chuẩn sau mỗi lệnh gọi print() để văn bản sẽ xuất hiện ngay lập tức trong thiết bị đầu cuối.