Từ 3.3 documentation:
stdin, stdout và stderr định đầu vào tiêu chuẩn chương trình thực thi của tiêu chuẩn đầu ra và xử lý tập tin lỗi chuẩn, tương ứng. Các giá trị hợp lệ là PIPE, DEVNULL, một bộ mô tả tệp hiện có (một số nguyên dương), một đối tượng tệp hiện có và Không có.
Vì vậy:
subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=subprocess.DEVNULL)
này chỉ tồn tại trong 3.3 và sau này. Nhưng tài liệu cho biết:
DEVNULL cho biết tệp đặc biệt os.devnull sẽ được sử dụng.
và os.devnull
tồn tại cách quay lại 2.4 (trước khi subprocess
tồn tại). Vì vậy, bạn có thể làm điều tương tự bằng tay:
with open(os.devnull, 'w') as devnull:
subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=devnull)
Lưu ý rằng nếu bạn đang làm một cái gì đó phức tạp hơn mà không phù hợp với một dòng duy nhất, bạn cần phải giữ devnull
mở cho toàn bộ cuộc sống của Popen
đối tượng, không chỉ xây dựng. (Nghĩa là, hãy đặt toàn bộ nội dung bên trong câu lệnh with
.)
Lợi thế của việc chuyển hướng đến /dev/null
(POS) hoặc bạn không tạo ra một đường ống không cần thiết và quan trọng hơn là có thể ' t chạy vào các trường hợp cạnh mà các khối con xử lý trên văn bản cho đường ống đó.
Điểm bất lợi là, theo lý thuyết, subprocess
có thể hoạt động trên một số nền tảng mà os.devnull
thì không. Nếu bạn chỉ quan tâm đến CPython trên POSIX và Windows, PyPy và Jython (phần lớn bạn), điều này sẽ không bao giờ là vấn đề. Đối với các trường hợp khác, hãy kiểm tra trước khi phân phối mã của bạn.
+1: cho devnull. Hãy chắc chắn rằng 'devnull' vẫn mở trong khi tiến trình con còn sống (câu lệnh có ngụ ý khác). Đoạn cuối cùng có vẻ không cần thiết: DEVNULL được triển khai thông qua os.devnull trong CPython. os.devnull làm việc với Jython. – jfs
@ J.F.Sebastian: Sau 'check_call' (nằm bên trong' with'), 'devnull' không còn cần thiết nữa. Nhưng vâng, có lẽ tôi nên làm rõ rằng đối với các trường hợp sử dụng phức tạp hơn mà không phù hợp với một dòng, toàn bộ điều cần phải ở bên trong 'with', không chỉ là' Popen'. – abarnert
@JFSebastian: Trong khi đó, đối với 'os.devnull', nó thực sự được bảo đảm tồn tại trên mọi nền tảng mà' xử lý con 'tồn tại, vì vậy không cần phải "kiểm tra trước khi sử dụng", hay bạn chỉ biết rằng nó cũng tồn tại trên Jython và do đó tôi nên di chuyển Jython vào danh sách các nền tảng mà bạn không cần phải kiểm tra? – abarnert