2011-12-05 18 views
12

多かれ少なかれ以下の設定があります。 ~/path/to/my/packagesには、私は2つのパッケージpackage1.mpackage2.mがあります。各パッケージの概要は、例えば、以下の通りです:パッケージ内からmathematicaパッケージをロードする

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

、私の問題は、私はpackage2.mpackage1.mで定義されたvecNormを使用したいということです。 package2から(安全に)package1をロードするにはどうすればよいですか?

現時点では以下のように、私は手動で両方のパッケージをロードする:

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

~/path/to/myに保存されたノートブックから。手動でロードしたいpackage2これは自動的に安全にロードされます。package1。一般的に、私は可能な限り少ない経路を変更する解などをmathematicaに求めています。これを達成するためのベストプラクティスは何でしょうか?

PSは:安全にすることで、私は将来的には、ときに私は、同様vecNormを使用するpackage3を定義しますし、同様に競合は起こりませんpackage1をロードされることを意味します。

答えて

13

一般に、パッケージを読み込むには2つの方法があります。一つは、いわゆる公共輸入され、そして、あなたの設定で、それはあなたがBeginPackageへのオプションの2番目の引数であるリストで、ロードしたいパッケージのコンテキスト名を示し、ここで

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

(* Usage messages etc *) 

Begin["`Private`"] 

(* code here *) 

End[] 
EndPackage[] 

として行われます。ロードされたパッケージは、メインパッケージがロードされた後に$ContextPathに残るため、このインポート方法はパブリックと呼ばれ、公に利用可能になります。第二の方法は、個人輸入と呼ばれ、概略的にこの方法では

BeginPackage["package2`"] 

(* Usage messages etc *) 

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

(* code here *) 

End[] 
EndPackage[] 

として行われ

、あなたのロードされた第二のパッケージは、このように個人輸入(Needsで)それをロードしたパッケージに利用できるようになります。

必要な状況は状況によって異なります。私はそれらを公開させなければ、すべての私の輸入品を私的にしようとします。しかし、デバッグのためには、最初にパブリックインポートを行うと便利です。それは、トップレベルで直接2番目のパッケージを使用することができるからです。

安全性については、任意の数のパッケージでパッケージを読み込むことができます。これは安全です。同じコンテクストに複数のパッケージを同時にロードすると、それらのパッケージに同じ短い名前のパブリックシンボルがない限り、これは安全です。さもなければ、あなたはシャドウイングの問題に遭遇しますが、それを避けるために必要な努力をすることが最善です(常に可能です)。

+0

あなたの最初の方法は私の問題を解決しました!ありがとう。 2つめは、試してみると、検索パスに問題があり、 'package1'が' package2'を見つけることができないようです。 - 私はこのオプションを自分でも試してみましたが、うまくいきませんでした。 – Dror

+2

@Dror 2番目のメソッドは正常に動作するはずです。そうでなければ、これはMathematicaが見つけられない場所に2番目のパッケージを置いたことを意味するはずです。次に、パッケージをMが見つけられる場所( '$ UserBaseDirectory'など)に移動するか、パッケージを含むディレクトリを' $ Path'変数に追加する必要があります。実際には、両方のインポートメソッドが機能するか、どちらも失敗するはずです。そのため、私はあなたの状況に少し困惑しています。 –

+0

これはすべて共有ディレクトリにあり、私の共同編集者の設定がわからないので、できるだけパスの変更がないような解決策が必要です。実際、2番目の方法ではベースパッケージが見つからないようです。私は確かに困惑している。しかし、解決策があることを幸せにしてください:) – Dror

関連する問題