Thực thi tập lệnh python từ tập lệnh shell và nhận đầu ra

Nếu bạn cần thực thi lệnh shell với Python, có hai cách. Bạn có thể sử dụng mô-đun quy trình con hoặc hàm

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
3

Liên kết được Tài trợ

Tùy chọn đầu tiên dễ dàng hơn để chạy một dòng mã và thoát, nhưng nó không linh hoạt khi sử dụng các đối số hoặc tạo đầu ra văn bản. Tùy chọn thứ hai phức tạp hơn để viết mã, nhưng nó sẽ cho phép tùy chỉnh nhiều hơn trong tập lệnh của bạn

Tôi sẽ xem xét cách thực hiện cả hai trong bài đăng trên blog này

Tôi khuyên bạn nên xem Shell Scripting. Cách tự động hóa các tác vụ dòng lệnh bằng Bash Scripting và Shell Programming. Nó giúp tôi mở rộng hiểu biết của mình về shell script.

Các tài nguyên tập lệnh shell khác
Linux Command Line và Shell Scripting Bible
Wicked Cool Shell Scripts

Nếu bạn đang làm việc với tập lệnh Python và shell, bạn cũng có thể muốn kiểm tra bốn cách khác nhau để chạy tập lệnh Python bên trong thiết bị đầu cuối. Nó ngược lại với những gì chúng ta có trong bài viết này—thật hấp dẫn khi chạy các tập lệnh python từ một thiết bị đầu cuối

Liên kết được Tài trợ

Mục đích của các lệnh shell là gì?

Shell là giao diện dòng lệnh [CLI] để tương tác với hệ điều hành. Nó cung cấp một môi trường để chạy các lệnh dựa trên văn bản và thường cung cấp các tính năng không có trong giao diện người dùng đồ họa [GUIs], chẳng hạn như đường ống và chuyển hướng

Môi trường Shell thường được gọi là dấu nhắc lệnh trong Windows và thiết bị đầu cuối trong hệ thống Linux

Để mở dấu nhắc lệnh trong Windows, nhấn Win + R, nhập cmd và nhấn Enter. Trên Linux, bạn có thể mở terminal bằng cách nhấn Ctrl+Alt+T. Nhấn Cmd + Space, nhập terminal và nhấn Enter nếu bạn đang dùng Mac OS

Mặc dù hầu hết người dùng thích các công cụ dựa trên GUI, nhưng các thao tác nâng cao thường ra lệnh sử dụng dấu nhắc. Chẳng hạn, các nhà khoa học dữ liệu và lập trình viên sử dụng các lệnh shell để quản lý tệp, thư mục và phần mềm. Ngoài ra, CLI có thể được sử dụng trong các tập lệnh hàng loạt hoặc công việc định kỳ để tự động hóa các tác vụ lặp đi lặp lại

Liên kết được Tài trợ

Làm cách nào để thực thi lệnh shell trong Python?

Các lập trình viên thường muốn thực thi lệnh shell bằng mã Python mở rộng hơn. Có hai lựa chọn để làm như vậy

Sử dụng mô-đun quy trình con

Mô-đun quy trình con là một phần của thư viện chuẩn trong Python. Nó cung cấp các phương tiện để thực thi các lệnh shell và ghi lại kết quả hoặc lỗi của chúng

Đây là cách chạy shell script bằng Python. Trong ví dụ này, chúng tôi đang sao chép tệp từ 'dirA' sang 'dirB. ’

import subprocess

# This is our shell command, executed in subprocess.

p = subprocess.run["cp", "dirA/file", "dirB"]

Mặc dù

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
4 là cách nhanh hơn nhiều để thực thi các tập lệnh shell, nhưng bạn nên sử dụng hàm tạo Popen để linh hoạt hơn

Hàm tạo Popen cho phép bạn chuyển các đối số bổ sung, chẳng hạn như shell=True, điều này sẽ khiến lệnh chạy trong một trình bao con

Ngoài ra, bạn có thể sử dụng

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
0 để yêu cầu Popen ghi lại kết quả trả về thay vì chỉ hiển thị nó trên màn hình

Liên kết được Tài trợ

Đây là một ví dụ nhanh về cách chạy lệnh shell và ghi lại đầu ra của nó

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]

Chương trình Python ở trên thực thi lệnh shell,

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
1 và nhận được kết quả. Ghi chú. Nếu chúng tôi không chỉ định
import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
2, Popen sẽ chỉ chụp dòng đầu ra đầu tiên

Việc bắt đầu các đối tượng Popen với tư cách là người quản lý bối cảnh thường rất thuận tiện. Chúng ta có thể sử dụng câu lệnh

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
3 trong Python. Đây là một ví dụ

with Popen[["ifconfig"], stdout=subprocess.PIPE] as proc:
   print[proc.stdout.read[]]

Trong đoạn mã trên, chúng tôi sử dụng

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
4 làm lệnh trình bao. Câu lệnh
import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
3 đảm bảo rằng đối tượng proc được đóng đúng cách khi chúng ta thoát khỏi khối

Điều này đặc biệt quan trọng khi bạn đang làm việc với một lượng lớn dữ liệu. Nếu bạn không đóng đối tượng proc đúng cách, chương trình của bạn sẽ đóng trước khi tất cả dữ liệu được đọc từ thiết bị xuất chuẩn. Ngoài ra, nó sẽ để mở một bộ mô tả tệp cho hệ điều hành của bạn

Sử dụng mô-đun Lệnh

Thư viện Lệnh là một cách thuận tiện khác để thực thi các tập lệnh shell bên trong Python. Mô-đun Lệnh là một trình bao bọc xung quanh phương thức Popen của mô-đun quy trình con. Tuy nhiên, Command có khả năng ghi nhật ký và gỡ lỗi vượt trội

Bạn có thể cài đặt thư viện Lệnh từ PyPI bằng lệnh bên dưới

pip install Command

Tập lệnh Python sau đây thực thi lệnh shell

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
0

Ngoài ra, bạn có thể đặt tham số gỡ lỗi thành một hàm để xử lý nhật ký theo cách khác. Ví dụ sau in nhật ký gỡ lỗi trên màn hình

Liên kết được Tài trợ
import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
1

Sử dụng mô-đun os

Mô-đun

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
6 trong Python cung cấp quyền truy cập vào nhiều tính năng cấp thấp của hệ điều hành. Bạn có thể sử dụng nó để liệt kê các thư mục, thay đổi thư mục [ cd ], liệt kê thông tin về tệp [ stat ], tạo tệp, v.v.

Đây là một ví dụ về cách sử dụng

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
6 để lấy danh sách các tệp trong thư mục hiện tại

Cảnh báo. Phương thức python này để thực thi các lệnh bash hiện không được dùng nữa

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
4

Ghi chú.

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
8 trả về một đối tượng tệp và chúng tôi sử dụng phương thức
import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
9 để lấy dữ liệu từ thiết bị xuất chuẩn

hệ điều hành. hệ thống so với quy trình con. Bạn nên sử dụng cái gì?

Mô-đun quy trình con luôn được ưu tiên hơn so với mô-đun

with Popen[["ifconfig"], stdout=subprocess.PIPE] as proc:
   print[proc.stdout.read[]]
0. Điều này là do cái sau có nguy cơ bị tấn công tiêm vỏ tăng cao

Bạn có thể chuyển nhiều hơn một lệnh tới tiện ích hệ thống bằng cách vận hành chúng bằng cách sử dụng một đường ống. Sau đây là một ví dụ về liệt kê các tệp và tạo một tệp ở đó

with Popen[["ifconfig"], stdout=subprocess.PIPE] as proc:
   print[proc.stdout.read[]]
1

Ngoài việc lấy danh sách các tệp và thư mục trong thư mục hiện tại, lệnh trên còn tạo một tệp. Kẻ tấn công có thể sử dụng lỗ hổng này để truy cập máy chủ của bạn và thực hiện các hoạt động có hại

Do đó, hãy tránh

with Popen[["ifconfig"], stdout=subprocess.PIPE] as proc:
   print[proc.stdout.read[]]
0 trừ khi điều đó là cần thiết và bạn hiểu những rủi ro—đó không phải là câu trả lời cho các tập lệnh shell exec

Liên kết được Tài trợ

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

Thường thì bạn có thể phải chạy các tập lệnh khác bên trong chương trình python khi bạn đang chạy nó từ trình bao. Để làm điều này, bạn cũng có thể sử dụng mô-đun quy trình con

Trong ví dụ này, chúng tôi sẽ trình bày cách chạy tệp tập lệnh bash có tên là

with Popen[["ifconfig"], stdout=subprocess.PIPE] as proc:
   print[proc.stdout.read[]]
3 lấy tên tệp đầu vào làm đối số

import subprocess

# This is our shell command, executed by Popen.

p = subprocess.Popen["ls -lh", stdout=subprocess.PIPE, shell=True]

print[p.communicate[]]
1

Nếu bạn đang sử dụng phiên bản Python cũ hơn [trước 3. 5], thay vào đó bạn nên sử dụng phương pháp

with Popen[["ifconfig"], stdout=subprocess.PIPE] as proc:
   print[proc.stdout.read[]]
4

Chủ Đề