Python模块/包系统对大型项目的可伸缩性

时间:2012-06-21 18:50:16

标签: python module namespaces package

我希望有一个很好的模块层次结构 项目..(Python似乎妨碍了这一点)我很困惑 模块和包的区别以及它们与C ++的关系 命名空间的概念。为了具体,我的项目是一个编译器和 代码生成阶段想要从一些集合中查询属性 在不同目录中维护的抽象表示 (实际上距离层次很远)

问题可以表述为:

屁股:让a.py和b.py成为项目层次结构中某处的两个源文件

然后:我想引用b.py中定义的函数 a.py - 理想情况下具有来自明确定义的根的相对路径 项目目录(即/ src)。我们想要一个通用的目的 解决方案,这将永远有效..

肮脏的黑客:这听起来很荒谬,但我把所有包含.py的子目录放在上面 投射到PYTHONPATH我们将能够用他们的名字引用它们,但是这个 代码的读者失去了任何层次感和关于不同项目的关系 课程等。

注意:Python.org上的教程仅提到了从文件c.py引用放置在其父目录中的文件d.py的特殊情况。制造的普遍性在哪里 Python可以扩展到真正的大型项目吗?

1 个答案:

答案 0 :(得分:1)

我不确定这是不是问题,但让我们看看。

假设我有以下软件包方案(为了便于阅读而排除了__init__.py个文件):

foo/baz/quux/b.py
foo/baz/quux/quuuux/c.py
foo/bar/a.py

我的foo/baz/quux/b.py文件包含以下内容:

def func_b():
    print 'func b'

我的foo/baz/quux/quuuux/c.py是:

def func_c():
    print 'func c'

如果包含foo的根目录(在您的情况下为src *)位于Python路径中,则aur foo/bar/a.py文件可以从{{1}开始导入任何其他模块}:

foo

可以这样使用import foo.baz.quux.b as b import foo.baz.quux.quuuux.c as c def func_a(): b.func_b() c.func_c()

foo/bar/a.py

你试过吗?你有错误吗?

*在部署项目时,我不相信根目录import foo.bar.a as a a.func_a() ,但让我们通过省略它来保持简单:)