将Python源代码拆分到单独的目录中?

dka*_*ins 6 python import project-organization pythonpath

以下是我的公司“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
Run Code Online (Sandbox Code Playgroud)

这是将源存储在磁盘上的传统方法:

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

PYTHONPATH=pysrc
Run Code Online (Sandbox Code Playgroud)

但出于组织目的(不同的团队、不同的版本控制等),我们希望将它们存储如下:

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

PYTHONPATH=bar/pysrc:zig/pysrc
Run Code Online (Sandbox Code Playgroud)

问题是:

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

例如,如果我们import com.foo,Python 会在哪里寻找__init__.py

符号链接这些目录有意义吗?例如:

pysrc/
  com/
    foo/
      bar/ -> symlink to /bar/pysrc/com/foo/
      zig/ -> symlink to /zig/pysrc/com/foo/
Run Code Online (Sandbox Code Playgroud)

欢迎任何一般代码组织建议。

Chu*_*ams 4

Python 将按顺序遍历 sys.path(包括 PYTHONPATH 等),在每个路径中查找 com.foo 包。它找到的第一个名称空间将用于排除其他名称空间,这与 Perl 或 Java 不同,它们有效地将包名称空间合并在一起。您可以采取一些措施来__path__改变这种行为,但“首场比赛获胜”是 Python 开箱即用的行为方式。

只要将所有 com.foo.bar 完全保留在 bar/ 中并将所有 com.foo.zig 完全保留在 zig/ 中,第二种布局就不会有任何问题。