2

git を使用して、同時に作成しているモジュール内の複数の機能に取り組むことができるようにしたいと考えています。現在、ワークスペースが 1 つしかない SVN を使用しているため、PYTHONPATH にワークスペースがあります。私はこれが理想的ではないことを認識しているので、誰かがこれを行うためのより「適切な」方法を提案できるかどうか疑問に思っていました.

仮説的な状況で詳しく説明しましょう。サブモジュール「foo」と「bar」を備えたモジュール「eggs」があるとします。「bar」のコンポーネントは foo のコードを使用するため、eggs/bar/a.py は「egg.foo をインポート」する場合があります。

「卵」が git リポジトリにあるとします。「foo」に変更を加えてみたいので、コピーします。問題は、eggs/bar の「import Egg.foo」が PYTHONPATH で元のリポジトリを見つけるため、変更したものの代わりに古い「foo」を使用してしまうことです。

モジュールの各コピーが独自の関連する「foo」を使用するように設定するにはどうすればよいですか? ありがとう。

編集 - 相対インポートへのポインタをありがとう。私はそれを読んで、それを適用する方法を見ることができます。それを使用する際に私が抱えていた問題の 1 つは、かなり大きなコードベースを構築したことであり、それについてあまりきちんとしていないため、ほとんどのモジュールには の下if __name__ == '__main__':に簡単な「セルフテスト」があります。 read は相対インポートでは機能しません:

私がグーグルアップできたもう1つの解決策は、意図的に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

変更を master ブランチにマージするには:

$ git merge experimental

上記の本の基本的な分岐とマージの章を参照してください。

于 2008-12-05T11:14:00.050 に答える
1

正しく理解していないかもしれませんが、gitのブランチは個別のパスを必要としないため、ここではgitが解決策になるようです。

作業バージョンごとにeggsモジュールのブランチを作成します。次に、そのブランチをチェックアウトすると、モジュール全体がサブモジュールのバージョンと一致する状態に変更されます。次に、必要なものをブランチ間で前後にマージできます。

そして、S.Lottが指摘したように、少しのリファクタリングでも害はないかもしれません;)

于 2008-12-05T14:39:44.890 に答える
1

「サブモジュール 'foo' と 'bar' を持つモジュール 'eggs' があるとします。'bar' のコンポーネントは foo のコードを使用するため、egg/bar/a.py は 'eggs.foo' をインポートできます。"

これは最適な構造ではない可能性があります。抜け出すのに苦労している他のモジュールがいくつかあることをお勧めします。

eggs.bar.a依存していeggs.fooます。他のものはにeggs依存していると思いeggs.fooます。さらに、それはand and andeggs.fooに分割できるのではないかと思います。eggs.fooeggs.quux

より良い構造を得るために、これをリファクタリングすることをお勧めします。このPYTHONPATH問題は、モジュール ツリーの間違った場所にあるものが多すぎることを示しています。

于 2008-12-05T11:56:56.950 に答える