2017-02-15 38 views
1

我試圖壓制腳本中的代碼段的輸出(即從Caffe網絡進行網絡初始化)。我已經試過包裝相應的代碼位的evalc命令抑制輸出到matder中的stderr

[suppressed_output, var_output] = evalc('someFunction(input)'); 

但是,這是行不通的。我仍然有大量來自網絡初始化的輸出(非錯誤)輸出堵塞了我的日誌(在腳本中通過fprintf('')打印的所有需要​​的輸出中)。我想,這是因爲相應的功能被寫入STDERR - 它打印的第一行是此警告(而不是STDOUT?):

WARNING: Logging before InitGoogleLogging() is written to STDERR 

...然後數百它是做什麼的後續行,例如:

I0215 15:01:51.840272 28620 upgrade_proto.cpp:66] Attempting to upgrade input file specified using deprecated input fields: tmp-def.prototxt 
I0215 15:01:51.840360 28620 upgrade_proto.cpp:69] Successfully upgraded file specified using deprecated input fields. 
... 

我可以以某種方式抑制輸出到STDERR(不與功能內容搞亂)?理想情況下,只能在本地執行此特定功能,因爲我仍然希望獲得潛在的錯誤消息。

如果它是相關的: 我通過MATLAB命令行和它的輸出與tee寫入日誌(mlexec.log)調用myScript

matlab -nodesktop -nosplash -display :1 -r "try, myScript; catch e, disp(getReport(e)), end, quit force" 2>&1| tee mlexec.log 
+0

我認爲語法是'2> NUL' – Rotem

+0

@Rotem哇,實際上指出了這個缺陷。 '2>&1'將'STDERR'輸出流式傳輸到'STDOUT',這是我調試waaay所需要的。將'STDERR'('2')流式傳輸到Nirvana'2> NUL'或另一個日誌文件('2> mlexec.stderr.log')解決了這個問題。謝謝 - 你想發佈這個作爲答案,所以我可以接受它? – Honeybear

+0

很高興我能幫到你...如果你願意,你可以把它作爲答案發布。 – Rotem

回答

0

這裏的問題是,在MATLAB命令行調用,從STDERR輸出由這個「命令」傳輸到STDOUT2>&1。由於.cpp文件似乎將其輸出流傳輸到STDERR(根據警告),它將被轉發到STDOUT並最終轉發日誌。

STDERR(2)與涅with 2>NUL或不同的日誌文件(例如2>mlexec.stderr.log)解決了這個問題。

-2

我想在一個評論張貼這一點,但它說我必須有50聲譽(我有49現在...)

我覺得this is what you're looking for 編輯/ UPDATE:

有一兩件事你可以做的是附上一段代碼有如下警告開/關語句:

warning('off','all') 
%your code here 
warning('on','all') 

這應該從部分停止任何警告輸出到stderr。我個人不建議這樣做,很高興知道你在做什麼,而MATLAB運行時不喜歡。

+0

這是一個鏈接唯一的答案,這是通常不鼓勵(鏈接中斷等)。請擴大鏈接中與問題相關的內容或刪除此內容。 – horchler

+0

我對不是很完整的答案表示歉意。我嘗試了評論,但是我沒有足夠長的時間來獲得聲譽發表評論在其他人的帖子。我希望這照顧@horchler :) – robotHamster

+0

@sharif anani:感謝您的建議和編輯。我知道'warning('off','all')'選項,但還沒有嘗試過,因爲問題不是警告,而是所有其他行(寫入STDERR)。儘管如此,我還是試了一下,但沒有效果。有趣的是,引用的警告也不會消失。我認爲它是寫入STDERR的文本的一部分,不是源自Matlab,而是源自.cpp源文件(因此不能由Matlab命令關閉)。 – Honeybear