19 votes

Comment puis-je supprimer la sortie d'une commande dans octave ?

Dans Octave, je peux supprimer ou cacher la sortie d'une instruction ajoutant un point-virgule à la fin d'une ligne :

octave:1> exp([0 1])
ans = [ 1.0000   2.7183 ]
octave:2> exp([0 1]);
octave:3> 

Maintenant, comment puis-je supprimer la sortie si la fonction affiche du texte (par exemple en utilisant la fonction disp() o print() ) avant de retourner sa valeur ? En d'autres termes, je veux être en mesure de faire ceci :

disp("Starting...");
% hide text the may get displayed after this point
% ...
% show all text again after this point
disp("Done!");

15voto

voithos Points 15066

Vous pouvez modifier le PAGER (qui est maintenant une fonction) pour rediriger la sortie standard. Sur les systèmes Unix, vous pouvez la rediriger vers /dev/null . Sous Windows, j'ai essayé de rediriger simplement vers un programme Python qui ne fait rien, et cela fonctionne décemment. (En fait, n'importe quel programme qui ignore l'entrée fera l'affaire).

PAGER('/dev/null');
page_screen_output(1);
page_output_immediately(1);

Tu peux juste le changer à nouveau quand tu as fini. Et peut-être encapsuler toute cette procédure dans une fonction.

oldpager = PAGER('/dev/null');
oldpso = page_screen_output(1);
oldpoi = page_output_immediately(1);

% Call function here

PAGER(oldpager);
page_screen_output(oldpso);
page_output_immediately(oldpoi);

Vous pouvez aussi simplement exécuter vos scripts de manière non interactive, et rediriger la sortie normalement.

octave script.m > /dev/null

3voto

Woltan Points 5153

Une solution rapide à votre problème, qui ne vaut peut-être même pas la peine d'être mentionnée, consiste à surcharger la fonction disp comme suit :

function disp(x)
end

Alors l'original disp n'est pas appelée mais la vôtre à la place, dans laquelle aucune sortie n'est générée.

J'ai aussi essayé de rediriger stdout d'octave, mais sans succès. J'espère que cette sale solution suffira peut-être dans votre situation^^.

2voto

Hero Qu Points 552

C'est une très vieille question, mais quand même, j'ai rencontré le même problème et voici l'astuce qui peut aider. On peut utiliser evalc pour envelopper un appel de fonction problématique. Par exemple, vous avez un code :

[a, b] = verbose_func(x,y);

Maintenant, vous pouvez le faire :

evalc('[a, b] = verbose_func(x,y)');

et le rendre silencieux.

C'est drôle, mais ça marche même avec d'autres eval à l'intérieur. Je veux dire qu'on peut avoir :

code_str = '[a, b] = verbose_func(x,y)';
eval(code_str);

qui est verbeux. Maintenant :

code_str = '[a, b] = verbose_func(x,y)';
evalc('eval(code_str)');

et ce n'est pas le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X