2011-11-08 13 views
5

私が書いているプログラムを構成するスクリプトが増えていて、ソースツリーを整理して正しくパッケージ化する時間になったと判断しました。私はこれが簡単な質問だと確信していますが、私はそれを行う方法を見つけることができません。モジュール内のパッケージ

私はモジュールのグループを持っていますが、それらは一緒にフィットしますが、トップレベルのモジュールでなければならず、モジュール名の接頭辞を付けて、実際にはより低いレベルのパッケージにする必要があります。

たとえば、import mystuffにアクセスして、すべてのmystuffを取得したいとします。でも私はimport mystuff.test.test1にできるはずです。私は

myprogram/ 
    mystuff.py 
    mystuff/ 
     __init__.py 
     tests/ 
      __init__.py 
      test1.py 
      test2.py 
      ... 

、私はこのようなソースツリーを作成するだろうと思ったが、この場合には、そう import mystuffは(限り mystuff/__init__.pyが空であるとして)何もしません、 mystuff/は常に mystuff.pyよりも優先されますようです。

希望の動作を得るにはどうすればよいでしょうか?またはこれは不可能であり、mystuff.pymystuff/に移動し、mystuff.mystuffとしてアクセスする必要があります(不要な繰り返しのようです)。

申し訳ありません。私はこれをどこかに記録しなければならないと考えていますが、私はどこかどこかを見つけることができません。 私はイグナシオの方法が正しいと信じていますが、本当に好きではありません!私がエディタで複数のファイルを開いていて、それらがすべて__init__.pyと呼ばれていると、物事が乱れることがあります。だから私は自分の構造をそのまま残し、mystuff.pymystuff/__init__.pyにリンクすることに決めました。なぜ私がこれをしてはいけないのかについて誰かが意見を持っているなら、私は彼らのことを聞きたい。最終的には実際に

、私はtar.gzを作成するときにシンボリックリンクを逆参照のdistutilsを作るための方法を見つけることができなかったので、私は、他の方法で回避をリンクしています、と私は私の出力でリンク切れになってしまいました。この方法は同じ効果を持ち、それを幸せに保ちます。

+0

はい。 Ignatioの応答が正しいので、あなたはそれを行うべきではありません。 – cwallenpoole

+0

@cwallenpoole。同意しましたが、終わりには私が設定した方法は*正確に*同じ効果があります。 'sdist'の出力さえ、私のリンクなしでIgnacioの出力とまったく同じになります。だから、それは開発中に私にとってより簡単になります。なぜこれが悪いことなのか、他の理由がありますか? – tjm

答えて

4

mystuff.pyのすべては、代わりにmystuff/__init__.pyに配置する必要があります。

+0

私はそれについて考えました。しかし、それはそれを行うための少し厄介な方法のように思えました。それはお勧めの方法ですか?もしそうなら、それは私がやることなのか、それとも単に「うまくいく方法」なのでしょうか?ご回答有難うございます。 – tjm

+0

これで完了です。 'foo/__ init __。py'にあるものは、インポート時に' foo'の一部になります。 –

+0

それは素晴らしいです。それほど簡単です:)ありがとうございました。 (許可されると受け入れます) – tjm

4

mystuff.pyパッケージとmystuff/パッケージの両方を使用することはできません。

次の2つの選択肢があります。

  • mystuff/__init__.py
  • mystuff.pyでコードを入れ、例えば、にmystuff/_stuff.pymystuff.pyの名前を変更し、その後mystuff/__init__.pyにあることをインポートします。

    myprogram/ 
        mystuff.py ------- 
        mystuff/   \ 
         __init__.py /
         _stuff.py <--- 
         tests/ 
          __init__.py 
          test1.py 
          test2.py 
          ... 
    

    mystuff/__init__.pyは、次のようになります:

2番目のオプションは、次のようになります

from mystuff._stuff import * 
関連する問題