Hướng dẫn python run shell command and stream output - python chạy lệnh shell và đầu ra luồng
Tóm tắt điều hành (hoặc phiên bản "TL; DR"): Thật dễ dàng khi có nhiều nhất một subprocess.PIPE, nếu không thì nó khó.Có thể là thời gian để giải thích một chút về cách Show
. Hàm 0 và 1 như bình thường.Bạn có thể cung cấp:
Các trường hợp dễ nhất (không có đường ống)Nếu bạn chuyển hướng không có gì (để lại cả ba là giá trị 2 mặc định hoặc cung cấp rõ ràng 2), 3 sẽ khá dễ dàng. Nó chỉ cần quay ra khỏi quy trình con và để nó chạy. Hoặc, nếu bạn chuyển hướng đến một người không phải là -____ 15, một 4 hoặc một luồng ____ ____ 36, nó vẫn dễ dàng, vì hệ điều hành thực hiện tất cả các công việc. Python chỉ cần xoay chuyển quy trình con, kết nối stdin, stdout và/hoặc stderr của nó với các mô tả tệp được cung cấp.Trường hợp vẫn còn dễ dàng: một ốngNếu bạn chỉ chuyển đổi một luồng, 3 vẫn có những thứ khá dễ dàng. Hãy chọn một luồng một lúc và xem.Giả sử bạn muốn cung cấp một số 1 không được kiểm tra hoặc đi đến một bộ mô tả tập tin. Khi quá trình cha mẹ, chương trình Python của bạn chỉ cần sử dụng 1 để gửi dữ liệu xuống đường ống. Bạn có thể tự làm điều này, ví dụ:
Hoặc bạn có thể chuyển dữ liệu STDIN đến 2, sau đó 3 hiển thị ở trên. Không có đầu ra nào trở lại nên 4 chỉ có một công việc thực sự khác: nó cũng đóng đường ống cho bạn. .Giả sử bạn muốn chụp 0 nhưng chỉ để stdin và 1 một mình. Một lần nữa, thật dễ dàng: Chỉ cần gọi 0 (hoặc tương đương) cho đến khi không còn đầu ra. Vì 1 là luồng Python I/O bình thường, bạn có thể sử dụng tất cả các cấu trúc thông thường trên đó, như:
Hoặc, một lần nữa, bạn có thể sử dụng 2, đơn giản là 3 cho bạn.Nếu bạn chỉ muốn chụp 1, nó hoạt động giống như với 0.Có một mẹo nữa trước khi mọi thứ trở nên khó khăn. Giả sử bạn muốn chụp 0, và cũng nắm bắt 1 nhưng trên cùng một đường ống với stdout:
Trong trường hợp này, 8 "Cheat"! Chà, nó phải làm điều này, vì vậy nó không thực sự gian lận: nó bắt đầu quá trình phụ với cả stdout và stderr của nó được hướng vào bộ mô tả ống (đơn) cung cấp lại quy trình cha mẹ (Python) của nó. Về phía cha mẹ, một lần nữa chỉ có một bộ mô tả đường ống duy nhất để đọc đầu ra. Tất cả đầu ra "stderr" hiển thị trong 9 và nếu bạn gọi 2, kết quả STDERR (giá trị thứ hai trong tuple) sẽ là 2, không phải là một chuỗi.Các trường hợp cứng: Hai hoặc nhiều đường ốngTất cả các vấn đề xảy ra khi bạn muốn sử dụng ít nhất hai đường ống. Trên thực tế, mã 8 có bit này:
Nhưng, than ôi, ở đây chúng tôi đã thực hiện ít nhất hai, và có thể ba, các đường ống khác nhau, vì vậy Trên Windows, điều này sử dụng Trên POSIX, điều này sử dụng Chủ đề hoặc cuộc thăm dò/chọn là cần thiết ở đây để tránh bế tắc. Ví dụ, giả sử rằng chúng tôi đã chuyển hướng cả ba luồng đến ba đường ống riêng biệt. Giả sử thêm rằng có một giới hạn nhỏ về số lượng dữ liệu có thể được nhét vào đường ống trước khi quá trình viết bị đình chỉ, chờ quá trình đọc "làm sạch" đường ống từ đầu kia. Hãy đặt giới hạn nhỏ đó cho một byte duy nhất, chỉ để minh họa. (Đây thực sự là cách mọi thứ hoạt động, ngoại trừ giới hạn đó lớn hơn nhiều so với một byte.) Nếu quá trình cha mẹ (python) cố gắng viết một số byte, say, Trong khi đó, giả sử quá trình phụ quyết định in một "Xin chào! Đừng hoảng sợ!" Lời chào. Bây giờ chúng tôi bị mắc kẹt: Quá trình Python đang ngủ, chờ nói xong "đi", và quá trình phụ cũng đang ngủ, chờ nói xong "Xin chào! Đừng hoảng sợ!". Mã 2 (thực tế là subprocess.Popen 7 trong đó các trường hợp có lông được xử lý) trả về một khi tất cả dữ liệu STDIN (nếu có) đã được gửi và tất cả dữ liệu stdout và/hoặc stderr đã được tích lũy.Nếu bạn muốn đọc cả 0 và 1 trên hai đường ống khác nhau (bất kể chuyển hướng stdin ), bạn cũng sẽ cần tránh bế tắc. Kịch bản bế tắc ở đây là khác nhau, nó xảy ra khi quy trình con viết một cái gì đó dài đến 1 trong khi bạn đang lấy dữ liệu từ 0 hoặc ngược lại, nhưng nó vẫn ở đó.Bản demoTôi đã hứa sẽ chứng minh rằng, không được tái định hướng, Python 8es viết cho stdout cơ bản, không phải 3. Vì vậy, đây là một số mã:
Khi chạy:
Lưu ý rằng thói quen đầu tiên sẽ thất bại nếu bạn thêm 8. Thứ hai sẽ bỏ qua Popen 8 nếu bạn thêm Popen 5 vì 3 đã được chuyển hướng đến stdin 1.. Làm thế nào để bạn thực hiện lệnh shell trong python và nhận đầu ra?Nhận đầu ra từ lệnh shell bằng cách sử dụng lệnh con khởi chạy lệnh shell mà chúng tôi muốn thực thi bằng hàm subprocess.popen. Các đối số cho lệnh này là lệnh shell dưới dạng danh sách và chỉ định đầu ra và lỗi. Đầu ra từ quy trình con.Launch the shell command that we want to execute using subprocess. Popen function. The arguments to this command is the shell command as a list and specify output and error. The output from subprocess.
Làm cách nào để chạy một lệnh shell trong Python?SubProcess.popen () Chúng tôi đang sử dụng quy trình con. Phương thức popen () để thực thi tập lệnh Echo Shell bằng Python. Bạn có thể đưa ra nhiều đối số hơn cho đối tượng hàm popen (), như shell = true, điều này sẽ làm cho lệnh chạy trong một shell riêng biệt.
we are using the subprocess. Popen() method to execute the echo shell script using Python. You can give more arguments to the Popen function Object() , like shell=True, which will make the command run in a separate shell.
Làm thế nào để bạn lưu trữ đầu ra của một lệnh cho một biến trong Python?Quá trình phụ Python.Sử dụng hàm SubProcess.check_output () Chúng ta có thể lưu trữ đầu ra trong một biến.Using subprocess. check_output() function we can store the output in a variable.
Làm thế nào để bạn in lệnh đầu ra trong Python?Python: Nhận đầu ra lệnh hệ thống.. Giải pháp mẫu:-. Mã python: Nhập quá trình phụ # Tệp và Danh sách thư mục returned_text = subprocess.check_output ("dir", shell = true Flowchart:. Trình chỉnh sửa mã Python:. |