wake-up-neo.com

Wie binde ich ein Perl-Modul ein, das sich in einem anderen Verzeichnis befindet?

Wie binde ich ein Perl-Modul ein, das sich in einem anderen Verzeichnis befindet? Es muss ein relativer Pfad von dem Modul sein, das es enthält.

Ich habe es versucht

Push ( @INC,"directory_path/more_path");

ebenfalls

Push ( @INC,"directory_path\\more_path");
46
ees

EDIT: Zuerst die richtige Lösung, ursprünglich aus diese Frage . Es ist das einzige, das relativ zum Modulverzeichnis sucht:

use FindBin;                 # locate this script
use lib "$FindBin::Bin/..";  # use the parent directory
use yourlib;

Es gibt viele andere Möglichkeiten, nach Bibliotheken in Bezug auf das aktuelle Verzeichnis zu suchen. Sie können Perl mit dem Argument -I aufrufen und das Verzeichnis des anderen Moduls übergeben:

Perl -I.. yourscript.pl

Sie können eine Zeile am oberen Rand Ihres Perl-Skripts einfügen:

use lib '..';

Sie können die Umgebungsvariable Perl5LIB ändern, bevor Sie das Skript ausführen:

export Perl5LIB=$Perl5LIB:..

Die Push-Strategie (@INC) kann auch funktionieren, muss jedoch in BEGIN {} eingeschlossen sein, um sicherzustellen, dass der Push vor der Modulsuche ausgeführt wird:

BEGIN {Push @INC, '..'}
use yourlib;
68
Andomar

Höchstwahrscheinlich ist der Grund, warum Ihr Push nicht funktioniert hat, die Ausführungsreihenfolge.

use ist eine Anweisung zur Kompilierungszeit. Sie Push sind zur Ausführungszeit fertig:

Push ( @INC,"directory_path/more_path");
use Foo.pm;  # In directory path/more_path

Sie können einen BEGIN-Block verwenden, um dieses Problem zu umgehen:

BEGIN {
    Push ( @INC,"directory_path/more_path");
}
use Foo.pm;  # In directory path/more_path

IMO, es ist am klarsten und daher am besten zu use lib:

use lib "directory_path/more_path";
use Foo.pm;  # In directory path/more_path

Unter perlmod finden Sie Informationen zu BEGIN und anderen speziellen Blöcken sowie zu deren Ausführung.

Bearbeiten

Zum Laden von Code in Bezug auf Ihr Skript/Ihre Bibliothek unterstütze ich nachdrücklich File :: FindLib

Sie können use File::FindLib 'my/test/libs'; Sagen, um irgendwo über Ihrem Skript im Pfad nach einem Bibliotheksverzeichnis zu suchen.

Angenommen, Ihre Arbeit ist folgendermaßen strukturiert:

   /home/me/projects/
    |- shared/
    |   |- bin/
    |   `- lib/
    `- ossum-thing/
       `- scripts 
           |- bin/
           `- lib/

Innerhalb eines Skripts in ossum-thing/scripts/bin:

use File::FindLib 'lib/';
use File::FindLib 'shared/lib/';

Findet Ihre Bibliotheksverzeichnisse und fügt sie Ihrem @INC Hinzu.

Es ist auch nützlich, ein Modul zu erstellen, das die gesamte Umgebungseinstellung enthält, die zum Ausführen Ihrer Toolsuite erforderlich ist, und es einfach in alle ausführbaren Dateien in Ihrem Projekt zu laden.

use File::FindLib 'lib/MyEnvironment.pm'
14
daotoad

'use lib' kann auch einen einzelnen String-Wert annehmen ...

#!/usr/bin/Perl
use lib '<relative-path>';
use <your lib>;
10
bedwyr

From perlfaq8:


Wie füge ich das Verzeichnis, in dem sich mein Programm befindet, zum Suchpfad für Module/Bibliotheken hinzu?

(beigetragen von brian d foy)

Wenn Sie das Verzeichnis bereits kennen, können Sie es wie jedes andere Verzeichnis zu @INC hinzufügen. Sie können lib verwenden, wenn Sie das Verzeichnis zur Kompilierungszeit kennen:

use lib $directory;

Der Trick bei dieser Aufgabe besteht darin, das Verzeichnis zu finden. Bevor Ihr Skript etwas anderes ausführt (z. B. ein chdir), können Sie das aktuelle Arbeitsverzeichnis mit dem Cwd-Modul abrufen, das mit Perl geliefert wird:

BEGIN {
    use Cwd;
    our $directory = cwd;
    }

use lib $directory;

Sie können eine ähnliche Aktion mit dem Wert $ 0 ausführen, der den Skriptnamen enthält. Das mag einen relativen Pfad enthalten, aber rel2abs kann ihn in einen absoluten Pfad verwandeln. Sobald Sie das haben

BEGIN {
    use File::Spec::Functions qw(rel2abs);
    use File::Basename qw(dirname);

    my $path   = rel2abs( $0 );
    our $directory = dirname( $path );
    }

use lib $directory;

Das mit Perl gelieferte FindBin-Modul funktioniert möglicherweise. Es findet das Verzeichnis des aktuell ausgeführten Skripts und legt es in $ Bin ab, das Sie dann verwenden können, um den richtigen Bibliothekspfad zu erstellen:

use FindBin qw($Bin);
7
brian d foy

Ich werde Ihnen sagen, wie es in Eclipse gemacht werden kann. Mein Entwicklungssystem - Windows 64bit, Eclipse Luna, Perlipse Plugin für Eclipse, Strawberry Pearl Installer. Ich benutze Perl.exe als Interpreter.

Eclipse> Neues Perl-Projekt erstellen> Projekt mit der rechten Maustaste anklicken> Erstellungspfad> Erstellungspfad konfigurieren> Registerkarte Bibliotheken> Externen Quellordner hinzufügen> Wechseln Sie zu dem Ordner, in dem alle Ihre Perl-Module installiert sind> ok> ok. Getan !

0
big_space

Ich bin überrascht, dass es noch niemand zuvor erwähnt hat, aber FindBin :: libs findet Ihre Bibliotheken immer, da sie an allen angemessenen Stellen in Bezug auf den Speicherort Ihres Skripts gesucht werden.

#!/usr/bin/Perl
use FindBin::libs;
use <your lib>;
0
Juan A. Navarro