Hướng dẫn execute linux command in python subprocess - thực thi lệnh linux trong quy trình con python

Bộ xử lý phụ là một mô-đun Python tích hợp có thể được sử dụng để tạo các quy trình mới và tương tác với các luồng dữ liệu đầu vào và đầu ra của chúng. Nói một cách đơn giản hơn, bạn có thể sử dụng nó để chạy các lệnh shell và chạy các nhị phân có thể thực thi thường nằm rải rác trong các thư mục khác nhau của bin bin trên một hệ thống tệp Linux. Bạn cũng có thể cung cấp một đường dẫn đầy đủ cho một nhị phân có thể thực thi và sử dụng bất kỳ công tắc dòng lệnh nào được liên kết với nhị phân. Bài viết này sẽ giải thích cách sử dụng mô -đun phụ và phương thức chạy của nó trong các ứng dụng Python. Tất cả các mẫu mã trong bài viết được thử nghiệm với Python 3.8.2 trên Ubuntu 20.04.

Phương pháp phụ

Phương thức SubProcess.Run có một danh sách các đối số. Khi phương thức được gọi, nó sẽ thực hiện lệnh và chờ quá trình kết thúc, cuối cùng sẽ trả về một đối tượng đã hoàn thành trên mạng. Đối tượng đã hoàn thành của các đối tượng đã hoàn thành, trả về stdout, stderr, các đối số gốc được sử dụng trong khi gọi phương thức và mã trả về. Stdout đề cập đến luồng dữ liệu được tạo bởi lệnh, trong khi Stderr đề cập đến bất kỳ lỗi nào được nêu trong quá trình thực hiện chương trình. Bất kỳ mã trả về khác không (mã thoát) sẽ có nghĩa là lỗi với lệnh được thực thi trong phương thức Subprocess.run.

Ví dụ 1: Nội dung đầu ra của tệp văn bản bằng phương thức Sub -Process.Run

Lệnh bên dưới sẽ xuất các nội dung của tệp dữ liệu của dữ liệu, giả sử rằng nó chứa một chuỗi tên = john.

importsubprocesssubprocess.run(["cat","data.txt"]) subprocess
subprocess.run(["cat", "data.txt"])

Chạy mã ở trên sẽ trả về đầu ra sau:

name = John đã hoàn thành=John
CompletedProcess(args=['cat', 'data.txt'], returncode=0)

Yếu tố đầu tiên của đối số danh sách là tên của lệnh sẽ được thực thi. Bất kỳ yếu tố nào trong danh sách theo phần tử đầu tiên đều được coi là tùy chọn dòng lệnh hoặc công tắc. Bạn cũng có thể sử dụng dấu gạch ngang và bảng điều khiển đôi, để xác định các tùy chọn. Ví dụ: để liệt kê các tệp và thư mục trong một thư mục, mã sẽ là quy trình con. lệnh như một yếu tố riêng lẻ trong danh sách được cung cấp cho phương thức phụ.

Ví dụ 2: ThoPress đầu ra của phương pháp phụ.

Để triệt tiêu đầu ra của phương thức phụ.

Nhập khẩu subprocess

Subprocess.run (["Cat", "data.txt"], stdout = subprocess.devnull, & nbsp; stderr = subprocess.devnull).run(["cat", "data.txt"], stdout=subprocess.DEVNULL,
  stderr=subprocess.DEVNULL)

Chạy mã trên sẽ tạo ra đầu ra sau:

Đã hoàn thànhProcess (args = ['cat', 'data.txt'], returnCode = 0)

Ví dụ 3: nắm bắt đầu ra của phương pháp phụ.

Để nắm bắt đầu ra của phương thức phụ.

interpressubProcess output = SubProcess.run (["Cat", "data.txt"], Capture_output = true) in (đầu ra) subprocess
output = subprocess.run(["cat", "data.txt"], capture_output=True)
print (output)

Chạy mã trên sẽ tạo ra đầu ra sau:

Đã hoàn thànhProcess (args = ['cat', 'data.txt'], returnCode = 0)(args=['cat', 'data.txt'], returncode=0,
  stdout=b'name=John\n', stderr=b'')

Ví dụ 3: nắm bắt đầu ra của phương pháp phụ.

Để nắm bắt đầu ra của phương thức phụ.

interpressubProcess output = SubProcess.run (["Cat", "data.txt"], Capture_output = true) in (đầu ra)

Đã hoàn thànhProcess (args = ['cat', 'data.txt'], returnCode = 0, & nbsp; stdout = b'name = john \ n ', stderr = b' ') subprocess
subprocess.run(["cat", "data.tx"], capture_output=True, text=True, check=True)

Chạy mã trên sẽ tạo ra đầu ra sau:

Đã hoàn thànhProcess (args = ['cat', 'data.txt'], returnCode = 0)
  subprocess.CalledProcessError: Command '['cat', 'data.tx']'
returned non-zero exit status 1.

Ví dụ 3: nắm bắt đầu ra của phương pháp phụ.

Để nắm bắt đầu ra của phương thức phụ.

interpressubProcess output = SubProcess.run (["Cat", "data.txt"], Capture_output = true) in (đầu ra) subprocess
output = subprocess.run(["cat"], input="data.txt", capture_output=True,
  text=True, check=True)
print (output)

Chạy mã trên sẽ tạo ra đầu ra sau:

Đã hoàn thànhProcess (args = ['cat', 'data.txt'], returnCode = 0)

Ví dụ 3: nắm bắt đầu ra của phương pháp phụ.

Để nắm bắt đầu ra của phương thức phụ. open("data.txt") as f:
  output = subprocess.run(["cat"], stdin=f, capture_output=True,
    text=True, check=True)
  print (output)

Chạy mã trên sẽ tạo ra đầu ra sau:

Đã hoàn thànhProcess (args = ['cat'], returnCode = 0, stdout = 'name = john \ n', stderr = '')

Ví dụ 6: Lệnh thực thi trực tiếp trong shell bằng phương thức SubProcess.Run

Có thể chạy một lệnh trực tiếp vào một shell, như là, thay vì sử dụng một chuỗi phân chia trong lệnh chính và các tùy chọn theo nó. Để làm điều này, bạn phải vượt qua shell shell = true như một đối số bổ sung. Tuy nhiên, điều này không được các nhà phát triển Python nản lòng vì sử dụng Shell Shell = true có thể dẫn đến các vấn đề bảo mật. Bạn có thể đọc thêm về ý nghĩa bảo mật từ đây.

interpressubProcessSubProcess.run ("cat 'data.txt,", shell = true) subprocess
subprocess.run("cat 'data.txt’", shell=True)

Chạy mã trên sẽ tạo ra đầu ra sau:

Sự kết luận

Phương thức phụ. Điều này giúp giới hạn tất cả các mã thành chính Python mà không cần phải có thêm mã tập lệnh shell trong các tệp riêng biệt. Tuy nhiên, nó có thể khá khó khăn để chính xác token các lệnh shell trong danh sách python. Bạn có thể sử dụng phương thức Shlex Shlex.Split () để mã hóa các lệnh shell đơn giản, nhưng trong các lệnh dài, phức tạp - đặc biệt là các lệnh có ký hiệu ống - shlex không phân chia chính xác lệnh. Trong những trường hợp như vậy, gỡ lỗi có thể là một vấn đề khó khăn. Bạn có thể sử dụng đối số của Shell Shell = true để tránh điều này, nhưng có một số mối quan tâm bảo mật nhất định liên quan đến hành động này.

Thông tin về các Tác giả

Hướng dẫn execute linux command in python subprocess - thực thi lệnh linux trong quy trình con python

Tôi là một nhà phát triển phần mềm freelancer và nhà văn nội dung yêu thích Linux, phần mềm nguồn mở và cộng đồng phần mềm miễn phí.

Python có thể chạy các lệnh linux không?

Python là ngôn ngữ được lựa chọn cho kịch bản shell và tự động hóa nhiệm vụ. Nó phổ biến trong quản trị hệ thống vì nó có thể thực thi các lệnh shell chỉ bằng các thư viện mặc định của nó. Có hai cách để chạy các lệnh Linux với Python: sử dụng mô -đun HĐH và sử dụng mô -đun phụ.using the os module and using the subprocess module.

Làm cách nào để chạy lệnh Unix trong tập lệnh Python?

Bạn không thể sử dụng các lệnh Unix trong tập lệnh Python của mình như thể chúng là mã Python, tên Echo gây ra lỗi cú pháp vì Echo không phải là một câu lệnh hoặc chức năng tích hợp trong Python.Thay vào đó, sử dụng tên in.Để chạy các lệnh Unix, bạn sẽ cần tạo một quy trình con chạy lệnh.create a subprocess that runs the command.

Bộ xử lý phụ Python có hoạt động trên Linux không?

Bộ xử lý phụ là một mô-đun Python tích hợp có thể được sử dụng để tạo các quy trình mới và tương tác với các luồng dữ liệu đầu vào và đầu ra của chúng.Nói một cách đơn giản hơn, bạn có thể sử dụng nó để chạy các lệnh shell và chạy các nhị phân có thể thực thi thường nằm rải rác trong các thư mục khác nhau của bin bin trên một hệ thống tệp Linux.you can use it to run shell commands and run executable binaries usually scattered in various “bin” folders across a Linux file system.

Những lệnh nào có thể được thực thi bằng cách chạy phụ?

Bộ xử lý phụ cho phép bạn gọi các lệnh bên ngoài và kết nối chúng với các đường ống đầu vào/đầu ra/lỗi của chúng (stdin, stdout và stderr).SubProcess là lựa chọn mặc định cho các lệnh chạy, nhưng đôi khi các mô -đun khác tốt hơn.external commands and connect them to their input/output/error pipes (stdin, stdout, and stderr). Subprocess is the default choice for running commands, but sometimes other modules are better.