2009-05-08 12 views
41

मैं एक पर्ल मॉड्यूल कैसे शामिल करूं जो एक अलग निर्देशिका में है? इसे मॉड्यूल से एक सापेक्ष पथ होना चाहिए जिसमें इसे शामिल किया गया है।मैं एक पर्ल मॉड्यूल कैसे शामिल करूं जो एक अलग निर्देशिका में है?

मैं

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

भी

push (@INC,"directory_path\\more_path"); 

उत्तर

56

संपादित करें: सही समाधान लाना सबसे पहले, मूल रूप से this question से। यह केवल एक ही है कि मॉड्यूल निर्देशिका के सापेक्ष खोज करता है:

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

कई अन्य तरीके कि वर्तमान निर्देशिका के सापेक्ष पुस्तकालयों के लिए खोज है। आप मैं तर्क के साथ पर्ल आह्वान कर सकते हैं, अन्य मॉड्यूल की सूची से गुजर रहा:

use lib '..'; 

आप पर्यावरण को संशोधित कर सकते हैं:

perl -I.. yourscript.pl 

आप अपने पर्ल स्क्रिप्ट के शीर्ष के निकट एक पंक्ति शामिल कर सकते हैं चर PERL5LIB इससे पहले कि आप स्क्रिप्ट चलाने:

export PERL5LIB=$PERL5LIB:.. 

धक्का (@INC) रणनीति भी काम कर सकते हैं, लेकिन यह में लिपटे हो गया है शुरू {} सुनिश्चित करने के लिए कि धक्का मॉड्यूल searc से पहले चलाया जाता है एच:

BEGIN {push @INC, '..'} 
use yourlib; 
+0

कई प्रयासों के बाद जो कोड आखिरकार काम करता था, उस सवाल से था कि एंडोमर से जुड़ा हुआ है: FindBin का उपयोग करें; # इस स्क्रिप्ट्यूज lib का पता लगाएं "$ FindBin :: बिन/.."; # मूल निर्देशिका ईपीएमएस का उपयोग करें; आपकी सभी मदद के लिए धन्यवाद! –

+0

चीयर्स, हर किसी को "वर्तमान निर्देशिका" पढ़ने जैसा लगता है जहां आपने "मॉड्यूल की निर्देशिका" लिखा था। – Andomar

+0

http://stackoverflow.com/a/90721/2668831 पढ़ने के बाद इस पर आया जो दावा करता है कि मॉड्यूलर पर्ल संगठन के कुछ रूपों के लिए FindBin विधि मजबूत नहीं है (कोई और स्पष्टीकरण करने में सक्षम हो सकता है) –

10

'का उपयोग lib' भी एक एकल स्ट्रिंग मान ले जा सकते हैं की कोशिश की है ...

#!/usr/bin/perl 
use lib '<relative-path>'; 
use <your lib>; 
+0

सापेक्ष पथ क्या सापेक्ष है? – Flimm

12

संभवतः आपके धक्का काम नहीं करने का कारण निष्पादन का आदेश है।

use एक संकलन समय निर्देश है। आप push निष्पादन समय पर किया जाता है:

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

आप एक शुरू ब्लॉक का उपयोग कर सकते इस समस्या को हल पाने के लिए:

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

IMO, यह use lib को स्पष्ट है, और इसलिए सबसे अच्छा:

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

BEGIN और अन्य विशेष ब्लॉक और जब वे निष्पादित करते हैं, तो जानकारी के लिए perlmod देखें।

संपादित

के लिए अपनी स्क्रिप्ट/पुस्तकालय के लिए लोड हो रहा है कोड रिश्तेदार, मैं दृढ़ता से File::FindLib

आप use File::FindLib 'my/test/libs'; कह सकते हैं पथ में अपनी स्क्रिप्ट के ऊपर कहीं भी एक पुस्तकालय निर्देशिका के लिए देखने के लिए समर्थन करते हैं।

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

एक स्क्रिप्ट के अंदर ossum-thing/scripts/bin में:

मान लें कि आपका काम इस तरह संरचित है

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

अपने पुस्तकालय निर्देशिका ढूंढने और उन्हें अपनी @INC में जोड़ देगा।

यह मॉड्यूल बनाने के लिए भी उपयोगी है जिसमें आपके पर्यावरण के सेट को चलाने के लिए आवश्यक सभी पर्यावरण सेट-अप शामिल हैं और इसे अपने प्रोजेक्ट में सभी एक्जिक्यूटिव में लोड करें।

use File::FindLib 'lib/MyEnvironment.pm' 
7

perlfaq8:


से मैं कैसे मॉड्यूल/पुस्तकालय खोज पथ के लिए निर्देशिका मेरा कार्यक्रम में रहती जोड़ सकता हूँ?

(ब्रायन डी Foy के योगदान)

आप पहले से ही निर्देशिका जानते हैं, तो आप यह @INC के रूप में आप किसी भी अन्य निर्देशिका के लिए होगा जोड़ सकते हैं। यदि आप संकलन समय पर निर्देशिका जानते हैं तो आप lib का उपयोग कर सकते हैं:

use lib $directory; 

इस कार्य में चाल निर्देशिका को ढूंढना है। इससे पहले अपनी स्क्रिप्ट (एक chdir के रूप में इस तरह के) कुछ और होता है, आप CWD मॉड्यूल के साथ वर्तमान कार्यशील निर्देशिका, जो पर्ल के साथ आता है प्राप्त कर सकते हैं:

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

use lib $directory; 

आप $ 0, के मूल्य के साथ एक ऐसी ही बात कर सकते हैं जो स्क्रिप्ट नाम रखता है। इसमें एक सापेक्ष पथ हो सकता है, लेकिन rel2abs इसे एक पूर्ण पथ में बदल सकता है। एक बार आपके पास

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

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

use lib $directory; 

पर्ल के साथ आने वाला FindBin मॉड्यूल काम कर सकता है। यह वर्तमान में चल स्क्रिप्ट की निर्देशिका पाता है और $ बिन में कहते हैं, जिसे फिर आप सही पुस्तकालय पथ के निर्माण के लिए उपयोग कर सकते हैं:

use FindBin qw($Bin); 
+0

आपका दूसरा सुझाव ('BEGIN' ब्लॉक के अंदर 'cwd' का उपयोग करके) काम नहीं कर रहा है। मुझे बस निम्न त्रुटि मिलती है: 'परिवर्तनीय" $ निर्देशिका "आयात नहीं किया जाता है ./thingy लाइन 16. // वैश्विक प्रतीक" $ निर्देशिका "के लिए स्पष्ट पैकेज नाम की आवश्यकता होती है ./thingy लाइन 16. // BEGIN सुरक्षित नहीं है त्रुटियों के बाद - संकलन निरंतर ./thingy लाइन पर छोड़ा गया। 16. – zrajm

+0

आपको मुझे अपना कोड दिखाना होगा। ऐसा लगता है कि आपने आयात सूची में $ निर्देशिका उद्धृत की हो सकती है। –

0

मैं हैरान कोई भी नहीं होने से पहले ही उल्लेख किया है हूँ, लेकिन FindBin::libs हमेशा मिलेगा आपकी libs के रूप में यह आपकी स्क्रिप्ट के स्थान के सापेक्ष सभी उचित स्थानों में खोज करता है।

#!/usr/bin/perl 
use FindBin::libs; 
use <your lib>; 
0

मैं आपको बताउंगा कि यह ग्रहण में कैसे किया जा सकता है। मेरा देव प्रणाली - विंडोज 64 बिट, ग्रहण लुना, ग्रहण के लिए पर्लिप्स प्लगइन, स्ट्रॉबेरी मोती इंस्टॉलर। मैं perl.exe का उपयोग अपने दुभाषिया के रूप में करता हूं।

ग्रहण> नया पेर्ल प्रोजेक्ट बनाएं> राइट क्लिक करें प्रोजेक्ट> पथ बनाएं> बिल्ड पथ कॉन्फ़िगर करें> लाइब्रेरी टैब> बाहरी स्रोत फ़ोल्डर जोड़ें> उस फ़ोल्डर पर जाएं जहां आपके सभी पर्ल मॉड्यूल स्थापित हैं> ठीक> ठीक है। किया हुआ !

संबंधित मुद्दे