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[]]
3Liê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ơnHà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ìnhLiê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ênViệ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[]]
0Ngoà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[]]
1Sử 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ạiCả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[]]
4Ghi 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ẩnhệ đ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 caoBạ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[]]
1Ngoà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 execLiê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[]]
1Nế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