2

我想使用 git 来处理我正在同时编写的模块中的多个功能。我目前正在使用 SVN,只有一个工作区,所以我的 PYTHONPATH 上只有一个工作区。我意识到这不太理想,所以我想知道是否有人可以提出一种更“正确”的方式来做到这一点。

让我用一个假设的情况来详细说明:我说我有一个模块“eggs”,带有子模块“foo”和“bar”。'bar' 中的组件使用 foo 中的代码,因此 eggs/bar/a.py 可能会“导入 egg.foo”。

假设“eggs”在 git 存储库中。我想尝试对“foo”进行一些更改,所以我复制了它。问题是eggs/bar 中的'import eggs.foo' 在PYTHONPATH 中找到了原始存储库,所以它最终使用旧的'foo' 而不是我修改过的。

我如何设置自己,使模块的每个副本都使用自己关联的“foo”?谢谢。

编辑-感谢指向相对导入的指针。我已经阅读了它,我可以看到如何应用它。我在使用它时遇到的一个问题是我已经建立了一个相当大的代码库,而且我对它并不太了解,所以大多数模块if __name__ == '__main__':在read 不使用相对导入:

我可以用谷歌搜索的另一个解决方案是故意操纵 sys.path,这似乎是一个更糟糕的黑客攻击。还有其他可能吗?

编辑 - 感谢您的建议。我最初误解了 git 分支,所以指出的分支正是我想要的。尽管如此,我之前没有听说过相对进口,所以也谢谢你。我学到了一些新东西,可能会结合它的用途。

4

3 回答 3

3

相对导入PEP 328)可能会有所帮助:

eggs/
  __init__.py
  foo.py
  bar.py

# foo.py
from __future__ import absolute_import
from . import bar

请参阅如何组织 Python 模块?其他选项。

编辑:

另一种选择是使用 S.Lott 和 Jim 的建议,即重组你的包以分解出用于实验分支并用于工作的eggs.foo部分(参见eggs.bar.aGit Community Book)。git

这是一个例子:

$ git status
# On branch master
nothing to commit (working directory clean)

[只是为了确保一切都好]

$ git checkout -b experimental
Switched to a new branch "experimental"

[做实验的东西]

$ git commit -a

[提交到实验分支]

$ git checkout master
Switched to branch "master"

[在主分支上工作]

$ git commit -a

要将更改合并到主分支:

$ git merge experimental

请参阅上述书中的基本分支和合并一章。

于 2008-12-05T11:14:00.050 回答
1

“假设我有一个模块‘eggs’,带有子模块‘foo’和‘bar’。‘bar’中的组件使用foo中的代码,所以eggs/bar/a.py可以‘import egg.foo’。”

这可能不是最好的结构。我建议您有一些其他模块难以摆脱。

你有eggs.bar.a依赖eggs.foo。我猜其他的东西eggs取决于eggs.foo. 此外,我怀疑eggs.foo可以将其划分为eggs.fooand eggs.quux,事情可能会更简单。

我建议重构它以获得更好的结构。这些PYTHONPATH问题是模块树中错误位置太多东西的症状。

于 2008-12-05T11:56:56.950 回答
1

也许我没有正确理解,但似乎 git 会这里的解决方案,因为 git 的分支不需要单独的路径。

为您的 egg 模块的每个工作版本创建一个分支。然后,当您签出该分支时,整个模块将更改为与您的子模块版本匹配的状态。然后,您可以在分支之间来回合并您需要的内容。

正如 S.Lott 指出的那样,可能进行一点重构也无妨;)

于 2008-12-05T14:39:44.890 回答