필터 지우기
필터 지우기

python from 2014b matlab - debug challanges - where is python stdout, stderr?

조회 수: 1 (최근 30일)
When running python from 2014b matlab, where does the output from the python program go?
The greater problem is I'm at a loss as to how to debug my python script. It runs well outside of matlab, but has started to fail when run inside matlab in an seemingly un-tracable manner as it has grown. I've added extra exception handlers, but can't see the output.
except :
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
traceback.print_exception(exc_type, exc_value, exc_traceback, limit=5, file=sys.stdout)
(I'll change that file=sys.stdout to a real file which can help)
Any debug tips, or where I can find stdout?

채택된 답변

Robert Snoeberger
Robert Snoeberger 2015년 1월 20일
편집: Robert Snoeberger 2015년 1월 20일
sys.stdout should be redirected to the MATLAB command window. Do you see output with Python's print function?
Example
>> py.print('hello!')
hello!
>>
sys.stderr is not redirected. When you use the functions print_tb and print_exception, you need to tell the functions to write to sys.stdout.
As a debug tip, the exception you catch in MATLAB due to a Python error is a PyException. The PyException has a property ExceptionObject, which is the same result you get from calling sys.exc_info.
>> try
py.fractions.Fraction(1,0)
catch e
end
>> e
e =
PyException with properties:
ExceptionObject: [1x1 py.tuple]
identifier: 'MATLAB:Python:PyException'
message: 'Python Error: both arguments should be Rational instances'
cause: {}
stack: [0x1 struct]
>> e.ExceptionObject
ans =
Python tuple with no properties.
(<type 'exceptions.TypeError'>, TypeError('both arguments should be Rational instances',), <traceback object at 0x0000000012AE9A48>)
>> py.traceback.extract_tb(py.operator.getitem(e.ExceptionObject, int32(2)))
ans =
Python list with no properties.
[('C:\\Python27\\lib\\fractions.py', 158, '__new__', 'raise TypeError("both arguments should be "')]
>>
  댓글 수: 3
Robert Snoeberger
Robert Snoeberger 2015년 1월 21일
Debugging will be very difficult without a valid matlab.exception.PyException class. The message says that matlab.exception.PyException contains a parse error or cannot be found. Use the which function to see if can be found.
>> which matlab.exception.PyException
C:\Program Files\MATLAB\R2014b\toolbox\matlab\external\interfaces\python\+matlab\+exception\PyException.m % matlab.exception.PyException constructor
>>
If it is found, then try to create a PyException to check for a parse error.
>> e = matlab.exception.PyException('MATLAB:Py:Test', 'testing', [])
e =
PyException with properties:
ExceptionObject: []
identifier: 'MATLAB:Py:Test'
message: 'testing'
cause: {}
stack: [0x1 struct]
>>
Chris Barnhart
Chris Barnhart 2015년 1월 21일
"Debugging will be very difficult without a valid matlab.exception.PyException class. " It is very difficult!
PyException wasn't found, so I added 'C:\Program Files\MATLAB\R2014b\toolbox\matlab\external' and subfolders with pathtool. Your fraction exception now works. Thank you.
Wonder if some other config issue can explain the py.print() issue....

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Call Python from MATLAB에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by