2011-12-05 18 views
12

मेरे पास निम्न सेटिंग कम या कम है। ~/path/to/my/packages में मेरे पास दो पैकेज package1.m और package2.m हैं। प्रत्येक पैकेज की रूपरेखा है, उदाहरण के लिए, निम्नलिखित:पैकेज के भीतर से गणित पैकेज लोड करें

BeginPackage["package1`"] 
[email protected]@Names["package1`*"]; 
[email protected]@Names["package1`*"]; 

Begin["`Private`"] 

vecNorm[vec_?VectorQ]:=Module[{},Return[Sqrt[vec.vec]]]; 

End[] 
[email protected]@Names["package1`*"]; 
EndPackage[] 

अब, मेरी समस्या यह है कि मैं vecNormpackage2.m में package1.m में परिभाषित का उपयोग करना चाहते। मैं package2 के भीतर से package1 लोड (सुरक्षित रूप से) कैसे लोड कर सकता हूं? एक नोटबुक ~/path/to/my में सहेजा से

SetDirectory[StringJoin[NotebookDirectory[], "packages"]]; 
Needs["package1`"] 
Needs["package2`"] 

:

पल में, मैं मैन्युअल दोनों संकुल के रूप में निम्नानुसार लोड। मैं मैन्युअल रूप से लोड करना चाहता हूं केवलpackage2 जो बदले में स्वचालित रूप से और सुरक्षित रूप से लोड हो जाएगा package1। आम तौर पर मैं एक समाधान चाहता हूं जो गणित के जितने संभव पथ इत्यादि को बदलता है। इसे पूरा करने के लिए सबसे अच्छा अभ्यास क्या होना चाहिए?

पुनश्च: सुरक्षित रूप से से मेरा मतलब है कि भविष्य में, जब मैं package3 जो रूप में अच्छी तरह vecNorm का उपयोग किया जाएगा निर्धारित करने होंगे और package1 रूप में अच्छी तरह कोई संघर्ष नहीं होगा लोड हो रहा है हो जाएगा।

उत्तर

13

पैकेज लोड करने के लिए दो आम तौर पर अनुशंसित तरीके हैं। एक सार्वजनिक आयात तथाकथित है, और अपने को स्थापित करने के रूप में यह

BeginPackage["package2`",{"package1`"}] 

(* Usage messages etc *) 

Begin["`Private`"] 

(* code here *) 

End[] 
EndPackage[] 

यहाँ किया जाएगा, तो आप पैकेज आप लोड करना चाहते हैं के संदर्भ नाम से संकेत मिलता है, सूची जो BeginPackage के लिए एक दूसरी वैकल्पिक तर्क है में । आयात करने का इस तरीका को सार्वजनिक कहा जाता है क्योंकि लोड किया गया पैकेज आपके मुख्य पैकेज लोड होने के बाद $ContextPath पर रहेगा, और इस प्रकार सार्वजनिक रूप से उपलब्ध होगा।

दूसरी विधि निजी आयात कहा जाता है, और रेखाचित्र के रूप में के रूप में

BeginPackage["package2`"] 

(* Usage messages etc *) 

Begin["`Private`"] 
Needs["package1`"] 

(* code here *) 

End[] 
EndPackage[] 

इस विधि में किया जाता है, अपने लोड दूसरा पैकेज केवल पैकेज है कि यह लोड करता है (Needs के साथ) के लिए उपलब्ध हो जाएगा, इस प्रकार निजी आयात ।

आपको जिस तरह की आवश्यकता है वह स्थिति पर निर्भर करेगा। मैं अपने सभी आयात निजी बनाने की कोशिश करता हूं जब तक कि मुझे उन्हें सार्वजनिक नहीं करना पड़े। हालांकि, डीबगिंग के लिए, पहले सार्वजनिक आयात करने के लिए यह आसान हो सकता है, तब से आप दूसरे स्तर के साथ सीधे शीर्ष-स्तर पर खेल सकते हैं।

सुरक्षा के लिए, आप किसी भी पैकेज द्वारा पैकेज लोड कर सकते हैं, और यह सुरक्षित रहेगा। जब आप एक ही संदर्भ में कई संकुल एक साथ लोड करते हैं, तब तक यह तब तक सुरक्षित रहेगा जब तक कि उन पैकेजों में समान नाम वाले सार्वजनिक प्रतीक न हों। अन्यथा, आप एक छायांकन समस्या कहलाते हैं, लेकिन इससे बचने के लिए प्रयास करना सर्वोत्तम होता है (यह हमेशा संभव है)।

+0

आपकी पहली विधि ने मेरी समस्या हल की! धन्यवाद। दूसरे के लिए, जब इसे आज़माते हैं, ऐसा लगता है कि खोज पथ में कोई समस्या है और 'package1'' package2' ढूंढने में सक्षम नहीं है। - मैंने इस विकल्प को अपने आप से भी कोशिश की और यह काम नहीं किया। – Dror

+2

@ डोर दूसरी विधि ठीक काम करना चाहिए। यदि ऐसा नहीं होता है, तो इसका मतलब यह होना चाहिए कि आपने अपना दूसरा पैकेज कहीं कहीं रखा है जहां गणित इसे नहीं ढूंढ सकता है। आपको या तो अपने पैकेज को ऐसे स्थान पर स्थानांतरित करना चाहिए जहां एम उन्हें ढूंढ सके (उदा। 'UserBaseDirectory'), या अपने पैकेज वाले '$ पथ' चर में निर्देशिका जोड़ें।दरअसल, दोनों आयात विधियां काम करती हैं, या दोनों विफल होनी चाहिए, इसलिए मैं आपकी स्थिति से थोड़ी परेशान हूं। –

+0

मैं एक समाधान चाहता हूं जो संभवतः पथ परिवर्तन से मुक्त है, क्योंकि यह सब एक साझा निर्देशिका में है और मुझे नहीं पता कि मेरे सहयोगियों की सेटिंग्स क्या हैं। दरअसल, ऐसा लगता है कि दूसरी विधि बेस-पैकेज नहीं पाती है। मैं निश्चित रूप से परेशान हूँ; लेकिन खुश है कि एक समाधान है :) – Dror

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