5

Here are some various Python packages my company "foo.com" uses:

com.foo.bar.web
com.foo.bar.lib
com.foo.zig.web
com.foo.zig.lib
com.foo.zig.lib.lib1
com.foo.zig.lib.lib2

Here's the traditional way to store the source on disk:

pysrc/
  com/
    foo/
      bar/
        web/
        lib/
      zig/
        web/
        lib/
          lib1/
          lib2/

PYTHONPATH=pysrc

But for organizational purposes (different teams, different revision control, etc.), we want to store these as follows:

bar/
  pysrc/
    com/
      foo/
        bar/
          web/
          lib/
zig/
  pysrc/
    com/
      foo/
        zig/
          web/
          lib/
            lib1/
            lib2/

PYTHONPATH=bar/pysrc:zig/pysrc

The question is:

Are there any issues with this second method of organization?

For example, if we import com.foo, where would Python look for the __init__.py?

Would symlinking these directories make sense? e.g.:

pysrc/
  com/
    foo/
      bar/ -> symlink to /bar/pysrc/com/foo/
      zig/ -> symlink to /zig/pysrc/com/foo/

Any general code organizational suggestions are welcome.

4

2 に答える 2

4

Python は sys.path (PYTHONPATH を含む) を順番に調べ、それぞれで com.foo パッケージを探します。最初に見つかったものは、パッケージの名前空間を効果的にマージする Perl や Java とは異なり、他のものを除外して使用します。この動作を変更するためにできることはありますが__path__、「最初に一致したものが勝つ」というのは、Python が箱から出してすぐに動作する方法です。

com.foo.bar のすべてを bar/ に完全に保持し、com.foo.zig のすべてを zig/ に完全に保持している限り、2 番目のレイアウトに問題はないはずです。

于 2010-06-18T20:00:49.067 に答える
3

PEP 420 ページを読む__init__.pyと、共有パッケージに以下を追加できるようです。

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

したがって、ディレクトリ構造は次のようになります (* マークの付い__init__.pyたファイルには上記のコードが含まれます)。

myroot/
├── bar
│   └── pysrc
│       └── com
│           ├── ****__init__.py****
│           └── foo
│               ├── ****__init__.py****
│               └── bar
│                   ├── __init__.py
│                   ├── lib
│                   │   ├── __init__.py
│                   │   └── barlib.py
│                   └── web
│                       ├── __init__.py
│                       ├── barweb.py
└── zig
    └── pysrc
        └── com
            ├── ****__init__.py****
            └── foo
                ├── ****__init__.py****
                └── zig
                    ├── __init__.py
                    ├── lib
                    │   ├── __init__.py
                    │   ├── lib1
                    │   │   ├── __init__.py
                    │   │   └── ziblib1.py
                    │   └── lib2
                    │       ├── __init__.py
                    │       └── ziblib2.py
                    └── web
                        ├── __init__.py
                        ├── zigweb.py

com/ディレクトリを指すように python パスを設定します。

barPath=/myroot/bar/pysrc/
zigPath=/myroot/zig/pysrc/
export PYTHONPATH=$PYTHONPATH:$barPath:$zigPath

テストするには(2.7.14と3.6.4で試しました):

from com.foo.bar.web.barweb import BarWeb
from com.foo.zig.web.zigweb import ZigWeb
b = BarWeb()
z = ZigWeb()

__init__.pyコードが得られない場合:

ImportError: No module named zig.web.zigweb
于 2018-02-16T19:23:08.837 に答える