Hướng dẫn run bash command in python - chạy lệnh bash trong python

Để phần nào mở rộng trên các câu trả lời trước đây ở đây, có một số chi tiết thường bị bỏ qua.

  • Thích
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    0 hơn
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    1 và bạn bè hơn
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    2 hơn
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    3 hơn
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    4 hơn
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    5
  • Hiểu và có thể sử dụng
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    6, AKA
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    7.
  • Hiểu ý nghĩa của
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    8 hoặc
    # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    9 và cách nó thay đổi trích dẫn và sự sẵn có của các tiện ích shell.
  • Hiểu sự khác biệt giữa
    subprocess.run["string for 'the shell' to parse", shell=True]
    # or
    subprocess.run[["list", "of", "tokenized strings"]] # shell=False
    
    0 và bash
  • Hiểu làm thế nào một quy trình con tách biệt với cha mẹ của nó và thường không thể thay đổi cha mẹ.
  • Tránh chạy thông dịch viên Python như một quy trình con của Python.

Những chủ đề này được đề cập trong một số chi tiết hơn dưới đây.

Thích
# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
0 hoặc
# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
1

Hàm

# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
3 là một công việc ở mức độ thấp nhưng thật khó để sử dụng chính xác và bạn kết thúc việc sao chép/dán nhiều dòng mã ... đã tồn tại thuận tiện trong thư viện tiêu chuẩn như một tập hợp các chức năng trình bao tải cấp cao hơn cho các mục đích khác nhau , được trình bày chi tiết hơn trong phần sau.

Đây là một đoạn từ tài liệu:

Cách tiếp cận được đề xuất để gọi các quy trình con là sử dụng chức năng

subprocess.run["string for 'the shell' to parse", shell=True]
# or
subprocess.run[["list", "of", "tokenized strings"]] # shell=False
4 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
subprocess.run["string for 'the shell' to parse", shell=True]
# or
subprocess.run[["list", "of", "tokenized strings"]] # shell=False
5 cơ bản có thể được sử dụng trực tiếp.

Thật không may, sự sẵn có của các chức năng trình bao bọc này khác nhau giữa các phiên bản Python.

  • # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    0 đã được chính thức giới thiệu trong Python 3.5. Nó có nghĩa là để thay thế tất cả những điều sau đây.
  • subprocess.run["string for 'the shell' to parse", shell=True]
    # or
    subprocess.run[["list", "of", "tokenized strings"]] # shell=False
    
    7 đã được giới thiệu trong Python 2.7 / 3.1. Về cơ bản nó tương đương với
    subprocess.run["string for 'the shell' to parse", shell=True]
    # or
    subprocess.run[["list", "of", "tokenized strings"]] # shell=False
    
    8
  • # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    1 đã được giới thiệu trong Python 2.5. Về cơ bản nó tương đương với
    subprocess.run[shlex.split["no string for 'the shell' to parse"]]  # shell=False
    # equivalent to
    # subprocess.run[["no", "string", "for", "the shell", "to", "parse"]]
    
    0
  • # XXX AVOID THIS BUG
    buggy = subprocess.run['dig +short stackoverflow.com']
    
    # XXX AVOID THIS BUG TOO
    broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        shell=True]
    
    # XXX DEFINITELY AVOID THIS
    pathological = subprocess.run[['dig +short stackoverflow.com'],
        shell=True]
    
    correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
        # Probably don't forget these, too
        check=True, text=True]
    
    # XXX Probably better avoid shell=True
    # but this is nominally correct
    fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
        shell=True,
        # Probably don't forget these, too
        check=True, text=True]
    
    2 đã được giới thiệu trong Python 2.4 trong mô-đun
    subprocess.run[shlex.split["no string for 'the shell' to parse"]]  # shell=False
    # equivalent to
    # subprocess.run[["no", "string", "for", "the shell", "to", "parse"]]
    
    2 ban đầu [PEP-324]. Về cơ bản nó tương đương với
    subprocess.run[shlex.split["no string for 'the shell' to parse"]]  # shell=False
    # equivalent to
    # subprocess.run[["no", "string", "for", "the shell", "to", "parse"]]
    
    3

API cấp cao so với
# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
3

____10 được tái cấu trúc và mở rộng là hợp lý và linh hoạt hơn so với các chức năng di sản cũ mà nó thay thế. Nó trả về một đối tượng

subprocess.run[shlex.split["no string for 'the shell' to parse"]]  # shell=False
# equivalent to
# subprocess.run[["no", "string", "for", "the shell", "to", "parse"]]
6 có nhiều phương pháp khác nhau cho phép bạn truy xuất trạng thái thoát, đầu ra tiêu chuẩn và một vài kết quả và chỉ số trạng thái khác từ quy trình con đã hoàn thành.

# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
0 là cách để đi nếu bạn chỉ cần một chương trình để chạy và trả lại quyền kiểm soát cho Python. Để biết thêm các kịch bản liên quan [các quy trình nền, có lẽ với I/O tương tác với chương trình phụ huynh Python], bạn vẫn cần sử dụng
# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
3 và tự mình chăm sóc tất cả các hệ thống ống nước. Điều này đòi hỏi một sự hiểu biết khá phức tạp về tất cả các bộ phận chuyển động và không nên được thực hiện một cách nhẹ nhàng. Đối tượng
subprocess.run["string for 'the shell' to parse", shell=True]
# or
subprocess.run[["list", "of", "tokenized strings"]] # shell=False
5 đơn giản hơn đại diện cho quá trình [có thể là vẫn còn] cần được quản lý từ mã của bạn trong phần còn lại của vòng đời của quá trình phụ.

Có lẽ nên nhấn mạnh rằng chỉ

# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
3 chỉ tạo ra một quá trình. Nếu bạn để nó ở đó, bạn có một quy trình con chạy đồng thời cùng với Python, vì vậy một quá trình "nền". Nếu nó không cần phải thực hiện đầu vào hoặc đầu ra hoặc phối hợp với bạn, nó có thể thực hiện công việc hữu ích song song với chương trình Python của bạn.

Tránh
# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
4 và
# XXX AVOID THIS BUG
buggy = subprocess.run['dig +short stackoverflow.com']

# XXX AVOID THIS BUG TOO
broken = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    shell=True]

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run[['dig +short stackoverflow.com'],
    shell=True]

correct = subprocess.run[['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True]

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run['dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True]
5

Kể từ thời gian vĩnh cửu [tốt, kể từ Python 2.5], tài liệu mô -đun

cmd = '''while read -r x;
   do ping -c 3 "$x" | grep 'min/avg/max'
   done 

Bài Viết Liên Quan

Chủ Đề