代码之家  ›  专栏  ›  技术社区  ›  dkamins

是否将python源拆分为单独的目录?

  •  4
  • dkamins  · 技术社区  · 15 年前

    以下是我公司“foo.com”使用的几种python包:

    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
    

    以下是在磁盘上存储源文件的传统方法:

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

    但出于组织目的(不同的团队、不同的修订控制等),我们希望将这些内容存储如下:

    bar/
      pysrc/
        com/
          foo/
            bar/
              web/
              lib/
    zig/
      pysrc/
        com/
          foo/
            zig/
              web/
              lib/
                lib1/
                lib2/
    
    PYTHONPATH=bar/pysrc:zig/pysrc
    

    问题是:

    第二种组织方法有什么问题吗?

    例如,如果我们 import com.foo ,python会在哪里查找 __init__.py ?

    把这些目录符号化有意义吗?例如。:

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

    欢迎提供任何通用代码组织建议。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Chuck Adams    15 年前

    python将按顺序通过sys.path(包括python path和一些),在每个路径中查找com.foo包。它发现的第一个,它将用于排除其他,不像Perl或Java,它有效地合并了包命名空间。你可以做些什么 __path__ 这改变了这种行为,但是“第一场比赛获胜”是python的开箱即用的行为。

    只要把com.foo.bar全部放在bar/中,把com.foo.zig全部放在zig/中,就不应该对第二个布局有任何问题。

        2
  •  3
  •   funseiki    8 年前

    阅读 PEP 420 page ,您似乎可以添加以下内容 __init__.py 到共享包:

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

    所以您的目录结构如下(*-标记 π介子 文件具有上述代码):

    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
    

    将python路径设置为指向 com/ 目录:

    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()
    

    没有拥有 π介子 代码收益率:

    ImportError: No module named zig.web.zigweb