2010-11-27 23 views
0

J'ai un code Perl que j'ai écrit pour un client qui, en partie, redimensionne les images en utilisant convert de ImageMagick.ImageMagick ne fonctionne pas, et ne donne pas de messages d'erreur non plus

Cela a été fait par des accents graves, capturant la sortie de cette manière:

$output = `convert foo.jpg foo.gif 2>&1`; # simplified example 

Récemment la société d'hébergement de mon client a fait ce qu'il a dit étaient « changements de DNS », et depuis cette date *, la commande n » t travail, et pas seulement, il n'y a pas de sortie $ non plus.

En supposant que quelque chose s'est passé comme s'il avait été déplacé sur un serveur qui n'a pas ImageMagick, ou une installation bâclée ou une mise à jour de la bibliothèque - ne devrais-je pas en retirer quelque chose? Au moins un "convertir non trouvé"? J'ai essayé avec system() aussi bien et c'est pareil. Image non convertie, rien ne revient.

Malheureusement, l'accès par ligne de commande n'est pas disponible.

* Je suppose que cela pourrait effectivement être une coïncidence.

+0

PerlMagick est-il une option? –

Répondre

0

Ils peuvent ne pas avoir shell installé (pensez perl/mod_perl en cours d'exécution dans un chroot), de sorte que les apostrophes inverses ne peuvent pas être exécutés à tout (car ils impliquent d'appeler sh -c 'convert ...'. Vérifiez toujours $? et $!.

+0

Notez que j'ai aussi essayé system(), et notez que ce code a fonctionné très bien jusqu'à très récemment, et le client a été dit que le changement était uniquement pour DNS. – AmbroseChapel

+0

Je viens de vérifier - les backticks et system() fonctionnent pour une simple commande 'ls', donc ils ont une sorte de shell. – AmbroseChapel

+0

Mais merci de me rappeler $? qui aide. – AmbroseChapel

1

Vous pouvez utiliser convert de debug option pour savoir ce qu'il fait

pour capturer toutes les sorties d'une utilisation de commande shell Capture::Tiny comme ceci:.

use Capture::Tiny 'capture'; 

my @command = qw(convert foo.jpg foo.gif); 

my $return_code; 
my ($stdout, $stderr) = capture { 
    $return_code = system(@command); 
}; 

$stdout et $stderr contiendra ce qu'il dit sur l'étain. $return_code renverra le code de retour de la tâche elle-même, qui est traditionnellement 0 en cas de succès ou une valeur numérique non nulle lorsqu'une erreur s'est produite.