Quy trình con Python chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn sang tệp

Sử dụng quy trình con. check_call chuyển hướng thiết bị xuất chuẩn sang một đối tượng tệp. từ quy trình con nhập check_call, STDOUT, CalledProcessError với open["out. txt","w"] dưới dạng f. cố gắng. check_call[['ls', '-l'], stdout=f, stderr=STDOUT] ngoại trừ CalledProcessError là e. in [e. tin nhắn] Bất kể bạn phải làm gì khi lệnh trả về trạng thái thoát khác không nên được xử lý trong trường hợp ngoại trừ

Trước Python 3. 5, ba chức năng này bao gồm API cấp cao để xử lý con. Bây giờ bạn có thể sử dụng hàm run[] trong nhiều trường hợp, nhưng rất nhiều mã hiện có gọi các hàm này. quy trình con. call [args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs] ¶ Chạy lệnh được mô tả bởi args

PIPE, thiết bị xuất chuẩn = quy trình con. PIPE] trong khi True. # kiểm tra xem một trong hai tiến trình con đã hoàn thành chưa proc_a. cuộc thăm dò [] proc_b. thăm dò ý kiến[] nếu proc_a. mã trả về không phải là Không hoặc proc_b. mã trả về không phải là Không có. break Lưu ý rằng cả hai quy trình con của chúng tôi đều được mở bằng stdin s và stdout s từ các đường ống bên trong

quy trình con. gọi [ ["/home/myuser/run. sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=myoutput] Sau đó, bạn có thể làm những gì mình muốn với myoutput [cần phải là một tệp btw]. Ngoài ra, bạn có thể làm điều gì đó gần hơn với đầu ra đường ống như thế này. dmesg. grep hda

quy trình con. hàm run[] nhận nhiều đối số khác nhau bao gồm stdin, stdout và stderr. Để chuyển hướng đầu ra, bạn cần chuyển một đối tượng tệp tới thiết bị xuất chuẩn. Ví dụ. quy trình con nhập khẩu. với mở ["ra. txt", "w"] dưới dạng tệp. quy trình con. chạy [ ["ls", "-l"], thiết bị xuất chuẩn=tệp] 3. 5K lượt xem. ·

Trong Trăn 3. 5+ để chuyển hướng đầu ra, chỉ cần chuyển phần xử lý tệp đang mở cho đối số thiết bị xuất chuẩn cho quy trình con. chạy. # Sử dụng danh sách các đối số thay vì chuỗi input_files = ['file1', 'file2', 'file3'] my_cmd = ['cat'] + input_files với open ['myfile', "w"] là tệp ngoài. quy trình con. run [my_cmd, stdout=outfile] Như những người khác đã chỉ ra, việc sử dụng một lệnh bên ngoài như cat cho mục đích này là hoàn toàn không liên quan

ví dụ call[], chụp thiết bị xuất chuẩn và thiết bị xuất chuẩn Nếu bạn đang sử dụng Python 3. 5+, sử dụng quy trình con. run[] thay vì nó an toàn hơn

tiêu chuẩn. đại dương. Ví dụ này phần lớn giống với ví dụ được giới thiệu trong phần đầu tiên. chúng tôi vẫn đang chạy một quy trình con để in đại dương. Tuy nhiên, điều quan trọng là chúng tôi chuyển các đối số từ khóa capt_output=True và text=True cho quy trình con. chạy

Đây là ví dụ về python về cách triển khai lệnh unix này bằng quy trình con Python. Cuộc gọi đầu tiên đến quy trình con mã hóa đường ống. Lệnh thứ hai mã hóa chuyển hướng. p1 = quy trình con. Popen[["zcat", "file1. dat. gz", "tệp2. dat. gz"], thiết bị xuất chuẩn = quy trình con

quy trình con. chạy trả về một quy trình con. Đối tượng CompletedProcess bị ràng buộc với kết quả. quy trình con. Đối tượng CompletedProcess bao gồm thông tin chi tiết về mã thoát của chương trình bên ngoài và đầu ra của nó. capture_output=True đảm bảo kết quả đó. tiêu chuẩn và kết quả. stderr được điền vào với đầu ra tương ứng từ chương trình bên ngoài

MÔ TẢ Mô-đun này cho phép bạn chạy một quy trình con và chuyển hướng stdin, stdout và/hoặc stderr sang các tệp và cấu trúc dữ liệu perl. Nó nhằm mục đích đáp ứng 99% nhu cầu sử dụng hệ thống, qx và open3 với API đơn giản, cực kỳ Perlish. Tốc độ, sự đơn giản và tính di động là tối quan trọng

Phần sau ghi lại thiết bị xuất chuẩn và thiết bị xuất chuẩn của quy trình trong một biến duy nhất. Nó tương thích với Python 2 và 3. từ nhập quy trình con check_output, CalledProcessError, lệnh STDOUT = ["ls", "-l"] hãy thử. đầu ra = check_output [lệnh, thiết bị xuất chuẩn = STDOUT]. giải mã [] thành công = True ngoại trừ CalledProcessError là e. đầu ra = e. đầu ra. giải mã [] thành công = Sai

#filters xuất quy trình con nhập quy trình con = quy trình con. Popen[['python','fake_utility. py'],stdout=quy trình con. PIPE] trong khi True. dòng = proc. tiêu chuẩn. readline[] nếu không phải dòng. break #the real code does filtering here print "kiểm tra. ", dòng. rstrip[] Tất nhiên bạn vẫn phải xử lý bộ đệm của quy trình con

quy trình không đồng bộ. create_sub process_shell [cmd, stdin=None, stdout=None, stderr=None, loop=None, limit=None, **kwds] ¶ Chạy lệnh shell cmd. Đối số giới hạn đặt giới hạn bộ đệm cho trình bao bọc StreamReader cho Quy trình. thiết bị xuất chuẩn và quy trình. stderr [nếu quy trình con. PIPE được chuyển đến các đối số thiết bị xuất chuẩn và thiết bị xuất chuẩn]. Trả về một phiên bản Process

Hiển thị hoạt động trên bài đăng này. Để trả lời câu hỏi ban đầu, cách tốt nhất IMO chỉ là chuyển hướng thiết bị xuất chuẩn của quy trình con trực tiếp sang thiết bị xuất chuẩn của chương trình của bạn [tùy chọn, điều tương tự có thể được thực hiện cho thiết bị xuất chuẩn, như trong ví dụ bên dưới] p = Popen [cmd, thiết bị xuất chuẩn = sys. thiết bị xuất chuẩn, thiết bị xuất chuẩn = sys. stderr] p. giao tiếp [] chia sẻ

Quá trình. giao tiếp [] cuộc gọi đọc đầu vào và đầu ra từ quá trình. thiết bị xuất chuẩn là đầu ra của quá trình. stderr sẽ chỉ được viết nếu xảy ra lỗi. Nếu bạn muốn đợi chương trình kết thúc, bạn có thể gọi Popen. đợi đã []

dmesg = quy trình con. Popen[['dmesg'], stdout=sub process. PIPE] grep = quy trình con. Popen[['grep', 'sda'], stdin=dmesg. thiết bị xuất chuẩn] dmesg. tiêu chuẩn. đóng [] đầu ra = grep. comunicate[][0] Để hiểu ví dụ trên, chúng ta phải nhớ rằng một quá trình được bắt đầu bằng cách sử dụng lớp Popen trực tiếp không chặn việc thực thi tập lệnh, vì nó hiện đang đợi

Chủ Đề