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

2024-06-01 06:08:30 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我公司的一些Python包”foo.com网站“用途:

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

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

^{pr2}$

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

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?在

符号链接这些目录有意义吗?e、 g.:

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

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


Tags: tocomwebfoo网站libbar公司
2条回答

Python会通过的系统路径按顺序(包括PYTHONPATH和一些),寻找com.foo网站每个包装。它发现的第一个问题是,它将使用排除其他方法,这与Perl或Java不同,后者可以有效地合并包名称空间。您可以对__path__执行一些操作来更改此行为,但是“first match wins”是Python开箱即用的行为方式。在

只要你保持com.foo.bar网站完全在酒吧里com.foo.zig网站完全在zig/中,第二个布局应该不会有任何问题。在

通读PEP 420 page,您似乎可以将以下__init__.py添加到共享包中:

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

因此,您的目录结构如下(*-标记为__init__.py文件具有上述代码):

^{pr2}$

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

没有__init__.py代码会产生:

ImportError: No module named zig.web.zigweb

相关问题 更多 >