【问题标题】:Scalability of Python Module / Package system to large projectsPython 模块/包系统对大型项目的可扩展性
【发布时间】:2012-06-22 03:09:38
【问题描述】:

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

问题可以表述为:

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

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

Dirty hack:这听起来很荒谬,但我将所有包含 .py 的子目录都放在了这上面 项目到 PYTHONPATH 我们将能够用他们的名字来引用它们,但是有了这个 代码的读者对不同项目失去了任何层次感和关系感 类等。

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

【问题讨论】:

  • 我不确定我是否理解问题所在。假设 b.py 在 /src/dir1/dir2 中,然后假设 /src 在 PYTHONPATH 上,您可以使用 import dir1.dir2.a 从 a.py 导入它。这假设 dir1 和 dir2 已通过在其中放置一个名为 __init__.py 的文件制成包。
  • 如果是这样,问题就解决了

标签: python module namespaces package


【解决方案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文件可以导入从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()

你试过了吗?你有什么错误吗?

* 当你部署你的项目时,我不相信根会是src,但是让我们通过省略它来保持它的简单:)

【讨论】:

  • 对不起,我的意思的根当然不是项目的根,这里面有等;但另一方面,我们说 src_root(我的意思)是 LEAST 文件夹,因此项目中任何带有“init.py”的文件夹都是文件系统层次结构中 src_root 的后代.因此,LEAST 基于树的通常深度顺序(如果从 a 到根的路径经过 b,则 a
  • 另外我觉得我的问题已经解决了,这个问题可以结束了
猜你喜欢
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 2014-08-09
相关资源
最近更新 更多