Quy trình con giá trị trả về của Python

Mô-đun quy trình con của Python cung cấp một số phương thức chạy các chương trình bên ngoài. Nó dễ sử dụng, nhưng để sử dụng mạnh mẽ với việc kiểm tra lỗi thích hợp thì cần thêm một số chi tiết

Nội dung

  • - lời gọi hàm chính

tóm tắt phương pháp

MethodReturnsOn ErrorĐề xuất sử dụng_______0_______8exit codereturns non-zero exit codeChương trình dự kiến ​​sẽ thất bại [hoặc trả về mã khác không]

from subprocess import check_output
numbers = check_output["seq 10",shell=True]
9exit code [luôn luôn bằng 0]tăng các chương trình không bị lỗi [lỗi là ngoại lệ, nếu bạn thứ lỗi cho lối chơi chữ]
from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
0đầu ra của chương trình

tóm tắt tham số vỏ

from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
2
from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
3 [mặc định]cmd kiểu chữ
from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
4danh sách
from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
5Khi không tìm thấy chương trình trả về mã thoát khác không [thường là 127]
Với
from subprocess import check_output
numbers = check_output["seq 10",shell=True]
9/
from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
0 sẽ nâng cao Ưu điểm Sử dụng đơn giản;
Cho phép mở rộng vỏ [e. g.
from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
8,
from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]
9]
và các lệnh đường ống phức tạp [
from subprocess import Popen,PIPE
p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
[out,err] = p.communicate[];
print ["cat returned code = %d" % p.returncode]
print ["cat output:\n\n%s\n\n" % out]
print ["cat errors:\n\n%s\n\n" % err]
0]An toàn hơn, dễ sử dụng hơn với các tên tệp có vấn đề [e. g. có dấu cách hoặc ký tự không phải tiếng Anh];
Tránh các sự cố bảo mật tiềm ẩn liên quan đến trình bao; Nhược điểm Các sự cố bảo mật tiềm ẩn, xem chức năng trình bao [chuyển hướng, đường ống, toàn cầu hóa, env-vars] yêu cầu mã python bổ sung;

Sử dụng cơ bản

  • Các ví dụ dưới đây cho thấy cách sử dụng điển hình, với các ví dụ có sẵn [hiếm khi có nhu cầu thực sự để chạy
    from subprocess import Popen,PIPE
    p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
    [out,err] = p.communicate[];
    print ["cat returned code = %d" % p.returncode]
    print ["cat output:\n\n%s\n\n" % out]
    print ["cat errors:\n\n%s\n\n" % err]
    
    1 từ bên trong python - sử dụng tốt hơn os. mô-đun đường dẫn cho những thứ như vậy]
  • Các ví dụ bắt đầu với việc kiểm tra lỗi ở mức tối thiểu, sau đó tiến tới mã hoàn chỉnh với việc kiểm tra lỗi thích hợp

check_call

Chạy chương trình [_______12_______2], STDOUT/STDERR được chia sẻ với tập lệnh [e. g. sẽ được in ra thiết bị đầu cuối]

from subprocess import check_call
check_call["ls -l /etc/passwd /dev/null",shell=True]

Tương tự, không có phép nội suy shell

from subprocess import check_call
check_call[["ls","-l","/etc/passwd","/dev/null"]]

check_output

Chạy chương trình [_______12_______3], STDOUT được trả về dưới dạng một biến

from subprocess import check_output
numbers = check_output["seq 10",shell=True]

gọi

Chạy chương trình, lấy mã thoát của nó.

from subprocess import Popen,PIPE
p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
[out,err] = p.communicate[];
print ["cat returned code = %d" % p.returncode]
print ["cat output:\n\n%s\n\n" % out]
print ["cat errors:\n\n%s\n\n" % err]
4 trả về 0 nếu biểu thức chính quy khớp với bất kỳ dòng nào, 1 nếu không có dòng nào khớp hoặc khác nếu xảy ra lỗi. Bởi vì một biểu thức chính quy có thể chứa các ký tự có ý nghĩa vỏ đặc biệt, tốt hơn là nên chạy nó với ____2_______3 và tránh mở rộng biến

from subprocess import call
rc = call[["grep","-Eq","[z|k|tc]sh","/etc/passwd"]]
if rc == 0:
    print ["someone is using zsh/ksh/tcsh"]
elif rc == 1:
    print ["zsh/ksh/tcsh not used"]
else:
    print ["an error occured, grep returned %d" % rc]

Nếu có bất kỳ lỗi nào xảy ra,

from subprocess import Popen,PIPE
p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
[out,err] = p.communicate[];
print ["cat returned code = %d" % p.returncode]
print ["cat output:\n\n%s\n\n" % out]
print ["cat errors:\n\n%s\n\n" % err]
4 sẽ in một thông báo tới STDERR, thông báo này sẽ được gửi tới cùng một STDERR của tập lệnh [e. g. màn hình] - người dùng sẽ nhìn thấy nó

giáo hoàng

cho phép kiểm soát tốt quy trình bên ngoài - lấy mã STDOUT, STDERR và mã trả về của nó. Trong ví dụ dưới đây,

from subprocess import Popen,PIPE
p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
[out,err] = p.communicate[];
print ["cat returned code = %d" % p.returncode]
print ["cat output:\n\n%s\n\n" % out]
print ["cat errors:\n\n%s\n\n" % err]
7 sẽ chứa nội dung của
from subprocess import Popen,PIPE
p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
[out,err] = p.communicate[];
print ["cat returned code = %d" % p.returncode]
print ["cat output:\n\n%s\n\n" % out]
print ["cat errors:\n\n%s\n\n" % err]
8 và
from subprocess import Popen,PIPE
p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
[out,err] = p.communicate[];
print ["cat returned code = %d" % p.returncode]
print ["cat output:\n\n%s\n\n" % out]
print ["cat errors:\n\n%s\n\n" % err]
9 sẽ chứa thông báo lỗi về việc không tìm thấy
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
0. Mã trả về sẽ là 1

from subprocess import Popen,PIPE
p = Popen[["cat","/etc/passwd","/foo/bar"], stdout=PIPE,stderr=PIPE]
[out,err] = p.communicate[];
print ["cat returned code = %d" % p.returncode]
print ["cat output:\n\n%s\n\n" % out]
print ["cat errors:\n\n%s\n\n" % err]

Kiểm tra lỗi

kiểm tra lỗi check_output [không mở rộng shell]

Các hàm

from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
1 sẽ tăng nếu chương trình bị lỗi [chạy nhưng trả về mã thoát khác không] hoặc nếu không tìm thấy chương trình. Ví dụ giả tạo sau đây sẽ chạy ngẫu nhiên
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
2,
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
3,
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
4,
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
5 - do đó tạo ra các loại lỗi khác nhau

from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]

[ tải xuống kiểm tra đầu ra. py ]

check_output kiểm tra lỗi [với mở rộng shell]

Hàm

from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
1 sẽ tăng nếu chương trình bị lỗi [chương trình chạy nhưng trả về mã thoát khác 0] hoặc nếu không tìm thấy chương trình [và mã trả về sẽ là 127]. khó xảy ra nhưng vẫn có thể xảy ra và cần được tính đến. Ví dụ giả tạo sau đây sẽ chạy ngẫu nhiên
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
2,
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
3,
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
4,
from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    cmd =   choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]
    numbers = check_output[[cmd,param]]
    print ["'%s %s' succeeded, result=%s" % [cmd,param,str[numbers]]]
except CalledProcessError as e:
    sys.exit["'%s %s' failed, returned code %d" % [cmd,param,e.returncode]]
except OSError as e:
    sys.exit["failed to execute program '%s': '%s'" % [cmd, str[e]]]
5 - do đó tạo ra các loại lỗi khác nhau

from subprocess import check_output, CalledProcessError
from random import choice
import sys
try:
    prog  = choice[ ["seq", "seqXX" ] ]
    param = choice[ ["foo", "10" ] ]

    # WARNING: constructing shell commands without input validation
    #          could lead to security issues!
    cmd = "%s %s" % [prog, param]
    numbers = check_output[cmd, shell=True]
    print ["command '%s' succeeded, returned: %s" % [cmd,str[numbers]]]
except CalledProcessError as e:
    if e.returncode==127:
        sys.exit["program '%s' not found" % [prog]]
    elif e.returncode

Chủ Đề