2009-11-29 44 views
12

Làm việc trên dòng lệnh python script - trong suốt tập lệnh, tôi có rất nhiều thông tin tôi đang print-vào cửa sổ đầu cuối để tôi có thể theo cùng với những gì đang xảy ra.Cách dễ dàng để thực hiện tùy chọn --quiet trong tập lệnh python

Sử dụng OptionParser Tôi muốn thêm tùy chọn --quiet để tôi có thể tắt tiếng tất cả đầu ra. Tôi đang tìm kiếm một cách pythonic để đi về thực hiện điều này trong suốt kịch bản vì vậy mà tôi không cuối cùng làm một cái gì đó như:

if not QUIET: # global variable set by OptionParser 
    print " my output " 

Am mới để trăn và chắc chắn có một cách tốt hơn. Ý tưởng?

Trả lời

27

Bạn có thể sử dụng logging và chỉ định những thứ không được in nếu QUIET cấp độ nhật ký khác.

Chỉnh sửa:THC4K's answer hiển thị ví dụ về cách thực hiện việc này, giả định rằng tất cả đầu ra phải im lặng nếu QUIET được đặt. Lưu ý rằng trong Python 3 from __future__ import print_function là không cần thiết:

print = logging.info 
logging.basicConfig(level=logging.WARNING if QUIET else logging.INFO, 
        format="%(message)s") 

Đối với đầu ra quan trọng là không nên im lặng bởi --quiet, xác định ví dụiprint:

iprint = logging.warning 
+4

+1 để đề xuất ghi nhật ký thay vì bánh xe sáng chế – tosh

+2

Tôi chỉ nhìn vào 'ghi nhật ký' rất ngắn gọn - điều này có nghĩa là, thay vì in, tôi có thể gửi tin nhắn văn bản tới 'đăng nhập' và sau đó (trong' __main__' quyết định cho dù tin nhắn đã được 'in', lưu vào một tập tin, hoặc chỉ im lặng hoàn toàn? – thornomad

+0

+1 để đăng nhập – alternative

2

Tại sao bạn không chỉ sửa đổi chức năng đầu ra của mình dựa trên việc chương trình có ở chế độ im lặng, vì vậy bạn chỉ thực hiện kiểm tra một lần?

if QUIET: 
    def DoOutput(stuff): 
     pass 
else: 
    def DoOutput(stuff): 
     print(stuff) 

Hoặc, bạn có thể tất nhiên đặt kiểm tra cho QUIET bên trong chức năng đầu ra của bạn:

def DoOutput(stuff): 
    if QUIET: 
     print(stuff) 

Các tình huống mà bạn đã mô tả thực sự là một trong những lý do mà Python 3 đã thay đổi print từ một từ khóa đến một chức năng thực tế: các dự án lớn của người dân đã trở nên rất phụ thuộc vào print là một từ khóa, và sau đó khi nó đến thời gian để sửa đổi cách đầu ra được ghi lại, nó yêu cầu một tái cấu trúc lớn; trong khi khi print là một chức năng thích hợp, bạn chỉ có thể xác định lại nó, do đó print(foo) sẽ xuất ra một tệp nhật ký, ví dụ. Đó là lý do tại sao thực hành tốt hơn để bọc đầu ra/ghi lại của bạn trong một chức năng thực tế, thay vì có print nằm rải rác về tập lệnh của bạn.

0

Nếu bạn muốn nó nhanh chóng và bẩn và bạn muốn loại bỏ tất cả đầu ra sau đó chuyển hướng stdout và stderr đến/dev/null. Đặt:

sys.stdout = open("/dev/null", "a") 
sys.stderr = open("/dev/null", "a") 

Tại thời điểm bạn phát hiện --quiet.

+0

Điều đó có thể sẽ hủy bất kỳ cơ hội nào của chương trình đang chạy trên các cửa sổ không có Cygwin, phải không? Windows không có/dev/null. – alternative

0
if QUIET: 
    sys.stdout=open("/dev/null","w") 
... 
print 'my output' 

Trên Windows, sử dụng "nul" thay vì "/ dev/null"

+4

Sẽ tốt hơn nếu sử dụng 'os.devnull' - điều này sẽ cho bạn"/dev/null "hoặc" nul "tùy thuộc vào hệ điều hành – Teddy

11

có thể im lặng tất cả đầu ra bằng cách chạy nó như python myscript.py > /dev/null

thay đổi sản lượng luồng trong tập lệnh:

if QUIET: 
    sys.stdout = open(os.devnull,'a') 
    sys.stderr = open(os.devnull,'a') 
print something 

sử dụng một chức năng in khác nhau

from __future__ import print_function 
if QUIET: 
    def print(*args): 
     pass 
print(something) 

sử dụng khai thác gỗ và loglevels

from __future__ import print_function 
import logging 
logging.basicConfig(level=logging.INFO, format="%(message)s") 
print = logging.info 
if QUIET: 
    logging.basicConfig(level=logging.ERROR) 

print(something) 
+1

+1 cho cấu hình ghi nhật ký. – alternative

1

Bạn có thể thay thế stdout với một proxy để lọc các cuộc gọi để viết hoặc writelines:

class FileProxy(object): 
    def __init__(self, real_file, quiet_flag): 
     self.real_file = real_file 
     self.quiet_flag = quiet_flag 

    def write(self, string): 
     if not self.quiet_flag: 
      self.real_file.write(string) 

    def writelines(self, strings): 
     if not self.quiet_flag: 
      self.real_file.write(strings) 

    def __getattr__(self, name): 
     return getattr(self.file, name) 

import sys 
sys.stdout = FileProxy(sys.stdout, QUIET) 

Ưu điểm của việc này là nó là nền tảng chéo (không giống như viết thư cho/dev/null) và nó vẫn sẽ hoạt động cho các câu lệnh in trong các thư viện của bên thứ ba mà bạn không có quyền kiểm soát. Bạn cũng có thể tinh chỉnh thêm để kiểm soát chính xác hơn nội dung được viết, ví dụ: để thêm dấu thời gian hoặc chuyển hướng báo cáo in tới hệ thống ghi nhật ký.

Các vấn đề liên quan