2010-04-09 58 views
5

我遇到了我的python腳本的問題。沉默記錄儀和打印到屏幕 - Python

它在屏幕上打印海量數據,我想阻止各種打印的屏幕。


編輯:

我使用的庫機械化,它的打印數據在屏幕上不少。

我已經把這些設置爲false,沒有運氣!

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

任何想法?

幫助將是驚人的,非常感謝!

+1

你能提供更多的信息嗎?你在說什麼腳本?打印什麼樣的數據?你能顯示一些代碼嗎?你在使用外部腳本嗎? – Ikke 2010-04-09 04:43:06

回答

10

(根據你的第二編輯)

如果你不想禁用所有的輸出,你可以試試具體到mechanize本身。 http://wwwsearch.sourceforge.net/mechanize/提供了一個片斷,我已經修改了(雖然我不知道這是否會工作):

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

當你打印的東西它會通過sys.stdout文件屏幕。你可以讓沒有打印屏幕文件更改爲任何其他文件(例如,你打開一個日誌文件):

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') 

當然,如果你在談論一些你調用庫,它可能會打印到sys.stderr。幸運的是,你可以做同樣的事情爲這一個(從上面繼續):

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

現在,如果由於某種原因,你要完全忽略標準輸出(或標準錯誤),並永遠不會再看到它,你可以定義你自己的類文件類,簡單地丟棄的對象:

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

而且,添加到可能的解決方案的喧囂,這裏是在Unix外殼有效的解決方案:

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

感謝您的驚人回覆!對於True/False錯字 – RadiantHex 2010-04-09 05:18:03

2

您可能重定向sys.std out和sys.stderr添加到文件或任何類似您的對象的文件,例如

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

sys.stdout = EatLog() 

但我不會建議,更簡單的選項是使用操作系統級重定向,例如,

python myscript.py > out.log 
+1

抱歉,如果您還需要重定向stderr(在bash中)'python myscript.py 2>&1> out.log' – cobbal 2010-04-09 05:18:02

0

您也可以使用StringIO模塊,而不是滾動自己的stdout流。有時候,標準輸出需要多於一個write方法(flush是另一種常見的方法),該方法將由StringIO處理。

import StringIO 
import sys 

sys.stdout = StringIO.StringIO()