代码之家  ›  专栏  ›  技术社区  ›  saffsd

如何使用python模块的多个git分支?

  •  2
  • saffsd  · 技术社区  · 17 年前

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

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

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

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

    edit-感谢您提供指向相对导入的指针。我已经阅读了它,我可以看到如何应用它。使用它的一个问题是,我已经建立了一个相当大的代码库,而且我对它不够整洁,所以大多数模块都有一个快速的“自检” if __name__ == '__main__': ,从我读到的内容来看,这与相对进口无关:

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

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

    3 回复  |  直到 17 年前
        1
  •  3
  •   Community Mohan Dere    8 年前

    Relative imports ( PEP 328 )可能会有所帮助:

    eggs/
      __init__.py
      foo.py
      bar.py
    
    # foo.py
    from __future__ import absolute_import
    from . import bar
    

    看见 How do you organize Python modules? 其他选择。

    编辑:

    另一种选择是使用S.Lott和Jim的建议,即重组您的套餐以确定 eggs.foo 使用的部件 eggs.bar.a 和使用 git 研究实验分支(参见 Git Community Book ).

    这里有一个例子:

    $ 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
    

    见第章 Basic Branching and Merging 从上面的书。

        2
  •  1
  •   S.Lott    17 年前

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

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

    正如S.Lott所指出的,也许一点重构也不会有什么坏处;)

        3
  •  1
  •   JimB    17 年前

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

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

    你有 eggs.bar.a 取决于 eggs.foo 我猜还有别的东西 eggs 取决于 鸡蛋.foo 此外,我怀疑 鸡蛋.foo 可以划分为 鸡蛋.foo eggs.quux 事情可能会更简单。

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