2010-04-09 23 views
5

Tôi gặp sự cố với tập lệnh python của mình.Trình ghi nhật ký im lặng và in ra màn hình - Python

Nó đang in lượng lớn dữ liệu trên màn hình và tôi muốn ngăn chặn tất cả các loại in ấn trên màn hình.


Edit:

Thư viện Tôi đang sử dụng là cơ giới hóa, và nó in rất nhiều dữ liệu trên màn hình.

Tôi đã đặt những thông số này thành sai không có may mắn!

br.set_debug_redirects(False) 
br.set_debug_responses(False) 
br.set_debug_http(False) 

Bất kỳ ý tưởng?

Trợ giúp sẽ rất tuyệt vời và được đánh giá cao!

+1

Bạn có thể cung cấp thêm một số thông tin không?Bạn đang nói về kịch bản gì? Loại dữ liệu nào được in? Bạn có thể hiển thị một số mã không? Bạn đang sử dụng tập lệnh bên ngoài? – Ikke

Trả lời

10

(Dựa trên chỉnh sửa thứ 2 của bạn)

Nếu bạn không muốn vô hiệu hóa tất cả các đầu ra, bạn có thể cố gắng được cụ thể cho mechanize riêng của mình. http://wwwsearch.sourceforge.net/mechanize/ cung cấp một đoạn, mà tôi đã sửa đổi (mặc dù tôi không chắc chắn nếu nó sẽ làm việc):

import logging 
logger = logging.getLogger("mechanize") 
# only log really bad events 
logger.setLevel(logging.ERROR) 

Khi bạn in một cái gì đó nó đi vào màn hình thông qua các tập tin sys.stdout. Bạn có thể thay đổi tập tin này cho bất kỳ tập tin khác (ví dụ, một file log bạn mở) để không có gì được in ra màn hình:

import sys 
# save the old stdout so you can print later (do sys.stdout = OLD_STDOUT) 
OLD_STDOUT = sys.stdout 
sys.stdout = open("logfile.txt", 'w') 

Tất nhiên, nếu bạn đang nói về một số thư viện mà bạn đang gọi điện thoại , nó có thể được in đến sys.stderr. May mắn thay, bạn có thể làm điều tương tự với bộ phim này (liên tục từ trên cao):

OLD_STDERR = sys.stderr 
sys.stderr = open("errorLog.txt", 'w') 

Bây giờ nếu vì một lý do, bạn muốn hoàn toàn bỏ qua stdout (hoặc stderr) và không bao giờ nhìn thấy nó một lần nữa, bạn có thể xác định tập tin giống như các lớp học của riêng bạn mà chỉ đơn giản là loại bỏ các đối tượng:

class Discarder(object): 
    def write(self, text): 
     pass # do nothing 
# now discard everything coming out of stdout 
sys.stdout = Discarder() 

Và, để thêm vào din các giải pháp có thể, đây là một giải pháp mà làm việc trong vỏ Unix:

# discards all input (change /dev/null to a file name to keep track of output) 
python yourScript.py > /dev/null 
+0

Cảm ơn bạn đã trả lời AMAZING! xin lỗi về typo True/False – RadiantHex

2

bạn có thể chuyển hướng sys.std ra và sys.stderr vào một tệp hoặc bất kỳ tệp nào như đối tượng của bạn, ví dụ:

class EatLog(object): 
    def write(self): 
     pass 

sys.stdout = EatLog() 

nhưng tôi không khuyến nghị rằng, tùy chọn đơn giản hơn là sử dụng chuyển hướng ở cấp hệ điều hành, ví dụ:

python myscript.py > out.log 
+1

và nếu bạn cần phải chuyển hướng stderr quá (trong bash) 'python myscript.py 2> & 1> out.log' – cobbal

0

bạn cũng có thể sử dụng mô-đun StringIO thay vì lăn luồng riêng của mình. Đôi khi, thiết bị xuất chuẩn cần nhiều hơn một phương thức write (flush là phương thức phổ biến khác), mà StringIO sẽ xử lý.

import StringIO 
import sys 

sys.stdout = StringIO.StringIO() 
Các vấn đề liên quan