Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73

    Gestire mancanza moduli

    ciao a tutti

    ho bisogno di un piccolo aiuto

    utilizzo per la connessione SSH il modulo Net::SSH2

    il punto è questo:

    ho un macchina xxx e una macchina yyy

    in xxx non posso installare il modulo Net::SSH2 mentre in yyy è già installato

    con $ENV{hostname} ottengo l'host su cui mi trovo

    poi ho fatto 2 subroutine una per xxx e una per yyy

    - se mi trovo in xxx, faccio quello che devo fare (non devo usare Net::SSH e quindi non è presente nella routine use Net::SSH2)

    - se mi trovo in yyy mi connetto in SSH a xxx e faccio quello che devo fare (è presente qui use Net::SSH2)


    il problema è che se avvio il programma da xxx mi dice che manca il modulo Net::SSH2 pur non richiamando quella subrroutine

    dovrei gestire questa eccezione (forse con eval)

    qualche idea??

    Grazie

  2. #2

    Re: Gestire mancanza moduli

    Succede perche' il Perl esamina prima di eseguirlo il codice ed effettua una pre-compilazione.

    Il blocco use viene visto a livello di compilazione e quindi ti viene richiesto,
    viceversa $ENV{HOSTNAME} è una variabile valutata a livello di esecuzione.

    A parte alcuni suggerimenti generali:

    - se hai a disposizione una shell, guarda che puoi utlizzare i moduli di CPAN anche da utente;
    quindi basta che (da utente) digiti cpan e poi install Net::SSH2 ;

    - il secondo suggerimento generico è che puoi utilizzare i moduli CPAN anche senza installarli nell'apposito spazio, ma integrandoli nel tuo programma. Come?
    Basta che scarichi il modulo e lo uploadi in una directory (con eventuali altri moduli necessari).


    http://search.cpan.org/src/RKITOVER/...ib/Net/SSH2.pm
    e poi ad esempio:

    codice:
    use FindBin qw($Bin);
    use lib ("$Bin/moduliScaricati");
    use Net::SSH2;
    Ma se anche così non risolvi, puoi variare le modalita' secondo cui Perl compila, interpreta ed esegue il programma:
    http://perldoc.perl.org/perlmod.html...c-INIT-and-END

    Infatti come vedi:
    http://perldoc.perl.org/functions/use.html

    codice:
    use Module();
    equivale a:
    codice:
    BEGIN { require Module };
    Quindi basta che al posto dello "use" utilizzi il "require", che viene utilizzato a runtime e non a livello di compilazione.
    Puoi fare ad esempio:

    codice:
    if ( $ENV{HOSTNAME} eq 'saintexHost')
    
    {
    	require Net::SSH2;
    		
    }
    	
    else {
    
    	print 'senza lib';
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.