2011-12-05 16 views
12

Aşağıdaki ayarlardan az ya da fazlası var. ~/path/to/my/packages'da iki paket package1.m ve package2.m var. Her paketin anahat, örneğin, takip ediyor:Bir paket içinden bir matematik paketini yükleyin

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

Şimdi benim sorunum vecNormpackage2.m yılında package1.m tanımlanan kullanmak istediğiniz olmasıdır. package2 içinden (güvenli şekilde) package1'u nasıl yükleyebilirim? şöyle anda

, elle iki paketi yüklemek:

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

~/path/to/my kaydedilmiş bir defterden. Elle sadecepackage2 yüklemek istiyorum, bu da otomatik olarak ve güvenli bir şekilde package1 yükleyecektir. Genelde matematiksel yollardan olabildiğince az yol alan bir çözüm istiyorum. Bunu başarmak için en iyi uygulama ne olmalıdır?

PS: güvenle derken gelecekte, ne zaman ben de vecNorm kullanacağınız package3 tanımlayacağız ve hem de hiçbir çakışma olur package1 yükleniyor olacağı anlamına gelir.

cevap

13

Paket yüklemek için genellikle önerilen iki yol vardır. Bir kamu ithalat sözde edilir ve sizin o İşte

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

(* Usage messages etc *) 

Begin["`Private`"] 

(* code here *) 

End[] 
EndPackage[] 

olarak yapılacaktır belirlenmesinde, sen BeginPackage ikinci opsiyonel argümanı listesinde, yüklemek istediğiniz paketin bağlam adını belirtmek . Yüklenen paket, ana paketiniz yüklendikten sonra $ContextPath'da kalacaktır ve bu nedenle herkes tarafından erişilebilir olacağından, bu şekilde içe aktarma yöntemi çağrılır.

İkinci yöntem dolayısıyla özel ithalat, Yüklü ikinci paket sadece (Needs ile) bunu yükler paketine sunulacak özel ithalat denir ve şematik Bu yöntemde

BeginPackage["package2`"] 

(* Usage messages etc *) 

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

(* code here *) 

End[] 
EndPackage[] 

olarak yapılır .

İhtiyaç duyduğunuz yöntem duruma göre değişecektir. Onları kamuya açmak zorunda kalmadan tüm ithalatlarımı özel yapmaya çalışıyorum. Bununla birlikte, hata ayıklama için, önce bir kamu ithalatı yapmak yararlı olabilir, o zamandan beri ikinci paketle doğrudan üst düzeydeki oynayabilirsiniz.

Güvenlikle ilgili olarak, herhangi bir paketin bir paketini yükleyebilirsiniz, bu güvenli olacaktır. Aynı bağlamda aynı anda birden fazla paket yüklediğinizde, bu paketler aynı kısa adı taşıyan genel sembollere sahip olmadıkça güvenli olacaktır. Aksi takdirde, bir gölgeleme problemi olarak adlandırılacaksınız, ama bundan kaçınmak için gereken çabayı yapmak en iyisidir (her zaman mümkündür).

+0

İlk yönteminiz benim problemimi çözdü! Teşekkürler. İkincisi ise, bunu denerken, arama yolunda bir sorun var gibi görünüyor ve 'package1'' package2' bulmayı başaramıyor. - Bu seçeneği kendim de denedim ve işe yaramadı. – Dror

+2

@Dror İkinci yöntem düzgün çalışmalıdır. Eğer değilse, bu, ikinci paketinizi Mathematica'nın bulamadığı bir yere yerleştirdiğiniz anlamına gelir. Daha sonra, paketlerinizi M'nin onları bulabileceği bir yere (örneğin, '$ UserBaseDirectory') yerleştirmeli veya paketlerinizi içeren dizini '$ Path' değişkenine eklemelisiniz.Aslında, her ikisi de içe aktarma yöntemleri çalışır veya her ikisi de başarısız olur, bu yüzden durumunuza biraz şaşırdım. –

+0

Tüm bunlar paylaşılan bir dizinde olduğundan ve işbirlikçilerimin ayarları neler olduğunu bilmediğimden, yol değişikliklerinden olabildiğince özgür olan bir çözüm istiyorum. Gerçekten de, ikinci yöntem temel paketi bulamıyor gibi görünüyor. Eminim şaşkınım; ama bir çözüm olduğu için mutluyum :) – Dror

İlgili konular