2011-12-05 20 views
12

Ho più o meno la seguente impostazione. In ~/path/to/my/packages ho due pacchetti package1.m e package2.m. contorno di ogni pacchetto è, per esempio, i seguenti:Carica un pacchetto mathematica da un pacchetto

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[] 

Ora, il mio problema è che io voglio usare vecNorm definite in package1.m in package2.m. Come posso caricare (sicuro) package1 da package2?

Al momento, carico manualmente entrambi i pacchetti come segue:

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

da un notebook salvata in ~/path/to/my. Voglio caricare manualmente solopackage2 che a sua volta verrà caricato automaticamente e in modo sicuro package1. In generale voglio una soluzione che cambi il meno possibile di percorsi ecc. Di mathematica. Quale dovrebbe essere la migliore pratica per realizzare questo?

PS: In modo sicuro voglio dire che in futuro, quando sarò definisco package3 che sarà utilizzato vecNorm come bene e sarò caricando package1 così conflitti accadrà.

risposta

13

Esistono due modi generalmente consigliati per caricare un pacchetto. Una è la cosiddetta importazione pubblica, e nella tua impostazione sarà fatto come

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

(* Usage messages etc *) 

Begin["`Private`"] 

(* code here *) 

End[] 
EndPackage[] 

Qui, si indica il nome del contesto del pacchetto che si desidera caricare, nella lista che è un secondo argomento opzionale per BeginPackage . Questo modo di importare è chiamato public perché il pacchetto caricato rimarrà sul $ContextPath dopo il caricamento del pacchetto principale e sarà quindi pubblicamente disponibile.

Il secondo metodo è chiamato importazione privata, ed è schematicamente fatto come

BeginPackage["package2`"] 

(* Usage messages etc *) 

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

(* code here *) 

End[] 
EndPackage[] 

In questo metodo, il secondo pacchetto loaded sarà disponibile solo al pacchetto che lo carica (con Needs), così importazione privata .

In che modo è necessario dipendere dalla situazione. Cerco di rendere private tutte le mie importazioni a meno che non sia necessario renderle pubbliche. Per il debug, tuttavia, può essere utile effettuare prima un'importazione pubblica, poiché in questo modo è possibile giocare con il secondo pacchetto direttamente al livello più alto.

Per quanto riguarda la sicurezza, è possibile caricare un pacchetto con qualsiasi numero di pacchi e questo sarà sicuro. Quando carichi diversi pacchetti nello stesso contesto simultaneamente, questo sarà sicuro fino a quando questi pacchetti non hanno simboli pubblici con lo stesso nome breve. Altrimenti, vi imbatterete in quello che viene chiamato un problema di shadowing, ma è meglio fare lo sforzo necessario per evitarlo (è sempre possibile).

+0

Il tuo primo metodo ha risolto il mio problema! Grazie. Per quanto riguarda il secondo, quando lo si prova, sembra che ci sia un problema con il percorso di ricerca e 'package1' non riesce a trovare' package2'. - Ho provato questa opzione da solo e non ha funzionato. – Dror

+2

@Dror Il secondo metodo dovrebbe funzionare correttamente. In caso contrario, questo dovrebbe significare che hai piazzato il tuo secondo pacchetto da qualche parte dove Mathematica non riesce a trovarlo. Dovresti quindi riposizionare i tuoi pacchetti in un posto dove M può trovarli (ad esempio '$ UserBaseDirectory'), o aggiungere la directory contenente i tuoi pacchetti alla variabile' $ Path'.In realtà, entrambi i metodi di importazione funzionano, o entrambi dovrebbero fallire, quindi sono un po 'perplesso per la tua situazione. –

+0

Voglio una soluzione che sia il più possibile libera da modifiche ai percorsi, poiché tutto questo è in una directory condivisa e non so quali sono le impostazioni dei miei collaboratori. In effetti, sembra che il secondo metodo non trovi il pacchetto base. Sono sicuro perplesso; ma felice che ci sia una soluzione :) – Dror

Problemi correlati