Error with fprintf in non-interactive Matlab session (startup option -batch)
3 views (last 30 days)
Show older comments
Hello everybody,
I just encountered an error when I open a new instance of Matlab with the startup option "-batch"
The error occurs when using fprintf within a for loop. Here's a code with the required lines to trigger the error:
cmdStrings = { ...
'diary on;' ...
'idcs = 1:100;' ...
'for f = 1:length( idcs );' ...
'fprintf(''>>> %d\n'', idcs(f) );' ...
'end;' ...
};
% compose commands as one string to hand it to new instance:
nStrings = length( cmdStrings );
sprintfStr = repmat( '%s', [1, nStrings] );
thisCmd = sprintf( sprintfStr, cmdStrings{:} );
% prepare command to invoke new instance with startup options:
cmndMatlab = sprintf( '!matlab -noFigureWindows -batch "%s" &', thisCmd );
eval( cmndMatlab ) ;
This will open a new instance of Matlab and create a file named "diary" in the default startup path.
The error can be seen in this diary file. Here's what is says:
>>> 1
>>> Error writing to output stream.
iostream stream error
{Error using fprintf
Error writing to output stream.
iostream stream error
}
Please note that the first iteration executes correctly and that the error happens not till the second iteration.
I have also done a try and catch approach to gain more details about the error:
E.identifier = 'iolib:badbit'
E.message = 'Error writing to output stream.iostream stream error'
This error only happens in batch-mode.
If I use the startup option "-r" instead (which opens an interactive session of Matlab), the code executes without any problems.
Also, if I convert the index into a string before handing it to fprintf I also don't get an error.
'thisNum = num2str( idcs(f) );' ...
'fprintf(''>>> %s\n'', thisNum );' ...
But this solution is not satisfying, because the script I'm trying to execute is very large and has a lot of subfunctions that use fprintf.
I'm using Matlab Version MATLAB Version: 9.7.0.1190202 (R2019b)
Any help would be very much appreciated.
Best regards,
Stefan
1 Comment
Erik Newton
on 19 Jan 2024
I've just hit this problem using R2021b.
I've had to go with using -r, and then adding ;exit on the end of my command.
E.g.
matlab -nodesktop -wait -r runTests;exit
Answers (1)
Samay Sagar
on 25 Sep 2024
I have also encountered this issue in the past. Batch mode requires using the MATLAB Starter EXE ("<matlabroot>/bin/matlab.exe") to redirect output to the terminal it was launched from. When running "!matlab" from the MATLAB prompt, the starter is skipped and "bin/<arch>/matlab.exe" is used instead which may not work as intended as it will not be connected to the output and error streams correctly.
You can modify the above script to use the starter EXE file instead of just "matlab":
matlabBin = [matlabroot(), '\bin\matlab'];
% prepare command to invoke new instance with startup options:
cmndMatlab = sprintf( '!%s -nodesktop -noFigureWindows -batch "%s" &',matlabBin, thisCmd );
eval( cmndMatlab ) ;
You can also use the "batch" function to run multiple scripts in background. You can refer the following documentation for more information about "batch" function:
0 Comments
See Also
Categories
Find more on Startup and Shutdown in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!